diff options
Diffstat (limited to 'indra/newview')
468 files changed, 19436 insertions, 34243 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index cc8e3ddea3..779c85c435 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -13,7 +13,6 @@ include(bugsplat) include(BuildVersion) include(CMakeCopyIfDifferent) include(CubemapToEquirectangularJS) -#include(DBusGlib) include(DragDrop) if (USE_DISCORD) include(Discord) @@ -47,7 +46,6 @@ include(UI) include(ViewerMiscLibs) #include(ViewerManager) include(VisualLeakDetector) -#include(VulkanGltf) include(ZLIBNG) include(LLPrimitive) @@ -84,6 +82,8 @@ if (HAVOK) endif() endif () +configure_file(llversioninfovars.h.in llversioninfovars.h @ONLY) + set(viewer_SOURCE_FILES gltfscenemanager.cpp gltf/asset.cpp @@ -238,6 +238,7 @@ set(viewer_SOURCE_FILES llfloaterfonttest.cpp llfloaterforgetuser.cpp llfloatergesture.cpp + llfloatergestureautocompletepicker.cpp llfloatergltfasseteditor.cpp llfloatergodtools.cpp llfloatergotoline.cpp @@ -249,7 +250,6 @@ set(viewer_SOURCE_FILES llfloaterhelpbrowser.cpp llfloaterhoverheight.cpp mpfloatertuning.cpp - llfloaterhowto.cpp llfloaterhud.cpp llfloaterimagepreview.cpp llfloaterimsessiontab.cpp @@ -302,6 +302,7 @@ set(viewer_SOURCE_FILES llfloatersceneloadstats.cpp llfloaterscriptdebug.cpp llfloaterscriptedprefs.cpp + llfloaterscripting.cpp llfloaterscriptlimits.cpp llfloatersearch.cpp llfloatersellland.cpp @@ -539,6 +540,7 @@ set(viewer_SOURCE_FILES llpathfindingobjectlist.cpp llpathfindingpathtool.cpp llpbrterrainfeatures.cpp + llperfstats.cpp llpersistentnotificationstorage.cpp llphysicsmotion.cpp llphysicsshapebuilderutil.cpp @@ -552,6 +554,7 @@ set(viewer_SOURCE_FILES llpreview.cpp llpreviewanim.cpp llpreviewgesture.cpp + llpublishedobjectmgr.cpp llpreviewnotecard.cpp llpreviewscript.cpp llpreviewsound.cpp @@ -571,6 +574,7 @@ set(viewer_SOURCE_FILES llsceneview.cpp llscreenchannel.cpp llscripteditor.cpp + llscripteditorws.cpp llscriptfloater.cpp llscrollingpanelparam.cpp llscrollingpanelparambase.cpp @@ -733,7 +737,6 @@ set(viewer_SOURCE_FILES llvoicechannel.cpp llvoiceclient.cpp llvoicevisualizer.cpp - llvoicewebrtc.cpp llvoinventorylistener.cpp llvopartgroup.cpp llvosky.cpp @@ -765,10 +768,6 @@ set(viewer_SOURCE_FILES rlvhandler.cpp ) -if (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64)) - list(REMOVE_ITEM viewer_SOURCE_FILES llvoicewebrtc.cpp) -endif () - set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING "The name of the viewer executable to create.") @@ -931,6 +930,7 @@ set(viewer_HEADER_FILES llfloaterfonttest.h llfloaterforgetuser.h llfloatergesture.h + llfloatergestureautocompletepicker.h llfloatergltfasseteditor.h llfloatergodtools.h llfloatergotoline.h @@ -942,7 +942,6 @@ set(viewer_HEADER_FILES llfloaterhelpbrowser.h llfloaterhoverheight.h mpfloatertuning.h - llfloaterhowto.h llfloaterhud.h llfloaterimagepreview.h llfloaterimnearbychat.h @@ -999,6 +998,7 @@ set(viewer_HEADER_FILES llfloatersceneloadstats.h llfloaterscriptdebug.h llfloaterscriptedprefs.h + llfloaterscripting.h llfloaterscriptlimits.h llfloatersearch.h llfloatersellland.h @@ -1219,6 +1219,7 @@ set(viewer_HEADER_FILES llpathfindingobject.h llpathfindingobjectlist.h llpathfindingpathtool.h + llperfstats.h llpbrterrainfeatures.h llpersistentnotificationstorage.h llphysicsmotion.h @@ -1233,6 +1234,7 @@ set(viewer_HEADER_FILES llpreview.h llpreviewanim.h llpreviewgesture.h + llpublishedobjectmgr.h llpreviewnotecard.h llpreviewscript.h llpreviewsound.h @@ -1254,6 +1256,7 @@ set(viewer_HEADER_FILES llsceneview.h llscreenchannel.h llscripteditor.h + llscripteditorws.h llscriptfloater.h llscriptruntimeperms.h llscrollingpanelparam.h @@ -1419,7 +1422,6 @@ set(viewer_HEADER_FILES llvoicechannel.h llvoiceclient.h llvoicevisualizer.h - llvoicewebrtc.h llvoinventorylistener.h llvopartgroup.h llvosky.h @@ -1451,13 +1453,8 @@ set(viewer_HEADER_FILES rlvhelper.h rlvhandler.h roles_constants.h - VertexCache.h - VorbisFramework.h ) - list(APPEND viewer_SOURCE_FILES llperfstats.cpp) - list(APPEND viewer_HEADER_FILES llperfstats.h) - source_group("CMake Rules" FILES ViewerInstall.cmake) #build_data.json creation moved to viewer_manifest.py MAINT-6413 @@ -1465,11 +1462,15 @@ source_group("CMake Rules" FILES ViewerInstall.cmake) 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 - PROPERTIES - COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake - ) +if (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64)) + set(DISABLE_WEBRTC ON) + add_compile_definitions(DISABLE_WEBRTC=1) +endif () + +if (NOT DISABLE_WEBRTC) + LIST(APPEND viewer_SOURCE_FILES llvoicewebrtc.cpp) + LIST(APPEND viewer_HEADER_FILES llvoicewebrtc.h) +endif() if (DARWIN) LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) @@ -1498,7 +1499,6 @@ if (DARWIN) 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. # Xcode 10.2 requires that Objective-C++ headers declare nullability of @@ -1525,18 +1525,39 @@ if (DARWIN) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) endif (DARWIN) +# Platform-specific files for IDE visibility (excluded from build on other platforms) +set(macosx_viewer_SOURCE_FILES + llappviewermacosx.cpp + llappviewermacosx-objc.mm + llfilepicker_mac.mm + llappdelegate-objc.mm + ) + +set(macosx_viewer_HEADER_FILES + llappviewermacosx.h + llappviewermacosx-objc.h + llfilepicker_mac.h + ) + +set(linux_viewer_SOURCE_FILES + llappviewerlinux.cpp + ) + +set(linux_viewer_HEADER_FILES + ) + +set(windows_viewer_SOURCE_FILES + llappviewerwin32.cpp + llwindebug.cpp + ) + +set(windows_viewer_HEADER_FILES + llappviewerwin32.h + llwindebug.h + ) + 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}" - ) - #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 () if (WINDOWS) @@ -1683,6 +1704,45 @@ if (WINDOWS) endif (WINDOWS) +# Add all platform-specific files to the target for IDE visibility +# Collect non-platform files for IDE visibility only +set(ide_visibility_files "") +if (NOT DARWIN) + list(APPEND ide_visibility_files ${macosx_viewer_SOURCE_FILES} ${macosx_viewer_HEADER_FILES}) +endif() +if (NOT (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)) + list(APPEND ide_visibility_files ${linux_viewer_SOURCE_FILES} ${linux_viewer_HEADER_FILES}) +endif() +if (NOT WINDOWS) + list(APPEND ide_visibility_files ${windows_viewer_SOURCE_FILES} ${windows_viewer_HEADER_FILES}) +endif() + +list(APPEND viewer_SOURCE_FILES ${ide_visibility_files}) + +# Mark non-platform files as excluded from build +if (WINDOWS) + set_source_files_properties( + ${macosx_viewer_SOURCE_FILES} + ${linux_viewer_SOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + ) +elseif (DARWIN) + set_source_files_properties( + ${windows_viewer_SOURCE_FILES} + ${linux_viewer_SOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + ) +elseif (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) + set_source_files_properties( + ${macosx_viewer_SOURCE_FILES} + ${windows_viewer_SOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + ) +endif() + # Add the xui files. This is handy for searching for xui elements # from within the IDE. file(GLOB_RECURSE viewer_XUI_FILES LIST_DIRECTORIES FALSE @@ -1700,7 +1760,8 @@ set_source_files_properties(${viewer_SHADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND viewer_SOURCE_FILES ${viewer_SHADER_FILES}) - +# note that the scripts which publish these files are sensitive to the file +# extensions. Be cautious about adding new file types here. set(viewer_APPSETTINGS_FILES app_settings/anim.ini app_settings/autoreplace.xml @@ -1711,7 +1772,6 @@ set(viewer_APPSETTINGS_FILES app_settings/grass.xml app_settings/ignorable_dialogs.xml app_settings/key_bindings.xml - app_settings/keywords_lsl_default.xml app_settings/logcontrol.xml app_settings/settings.xml app_settings/settings_crash_behavior.xml @@ -1726,6 +1786,7 @@ set(viewer_APPSETTINGS_FILES #packages-info.txt featuretable.txt featuretable_mac.txt + featuretable_linux.txt ) source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) @@ -1749,6 +1810,15 @@ set_source_files_properties(${viewer_CHARACTER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) +set(viewer_MISC_FILES + viewer_manifest.py + ) + +set_source_files_properties(${viewer_MISC_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND viewer_SOURCE_FILES ${viewer_MISC_FILES}) + if (WINDOWS) file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) @@ -1760,13 +1830,6 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) endif (WINDOWS) -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}") - - set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") -endif() - list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) add_executable(${VIEWER_BINARY_NAME} @@ -1775,6 +1838,8 @@ add_executable(${VIEWER_BINARY_NAME} ${viewer_SOURCE_FILES} ) +target_include_directories(${VIEWER_BINARY_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + # add package files file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) @@ -2126,11 +2191,13 @@ elseif (DARWIN) target_link_libraries(${VIEWER_BINARY_NAME} llphysicsextensionsos) endif() else (WINDOWS) - # Linux - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Wl,--Map=${VIEWER_BINARY_NAME}.MAP" - ) + if (HAVOK OR HAVOK_TPV) + # Linux + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -no-pie -Wl,--Map=${VIEWER_BINARY_NAME}.MAP" + ) + endif () endif (WINDOWS) # *NOTE: - this list is very sensitive to ordering, test carefully on all @@ -2178,7 +2245,6 @@ target_link_libraries(${VIEWER_BINARY_NAME} llcorehttp llcommon llmeshoptimizer - ll::ndof lllogin llprimitive llappearance @@ -2189,10 +2255,6 @@ target_link_libraries(${VIEWER_BINARY_NAME} ll::openxr ) -if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64))) - target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc ) -endif () - if (ENABLE_MEDIA_PLUGINS) target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc ) if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD)) @@ -2206,8 +2268,12 @@ if (ENABLE_MEDIA_PLUGINS) target_compile_definitions(${VIEWER_BINARY_NAME} PRIVATE LL_CEF=1) endif () +if (NOT DISABLE_WEBRTC) + target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc ) +endif() + if (USE_DISCORD) - target_link_libraries(${VIEWER_BINARY_NAME} ll::discord_sdk ) + target_link_libraries(${VIEWER_BINARY_NAME} ll::discord_sdk ) endif () if (TARGET ll::velopack) @@ -2215,11 +2281,11 @@ if (TARGET ll::velopack) endif () if( TARGET ll::intel_memops ) - target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops ) + target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops ) endif() if( TARGET ll::nvapi ) - target_link_libraries(${VIEWER_BINARY_NAME} ll::nvapi ) + target_link_libraries(${VIEWER_BINARY_NAME} ll::nvapi ) endif() if ( TARGET llconvexdecomposition ) @@ -2287,6 +2353,10 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES GNU) PROPERTIES COMPILE_FLAGS -Wno-unused-function) set_source_files_properties(llmutelist.cpp PROPERTIES COMPILE_FLAGS -Wno-free-nonheap-object) + set_source_files_properties( + llpaneloutfitedit.cpp + llviewerassetstorage.cpp + PROPERTIES COMPILE_FLAGS -Wno-array-bounds) endif () message("Copying fonts") @@ -2319,14 +2389,13 @@ if (LINUX) set(COPY_INPUT_DEPENDENCIES ${VIEWER_BINARY_NAME} SLPlugin - #media_plugin_gstreamer010 - llcommon + media_plugin_cef + media_plugin_gstreamer10 + media_plugin_libvlc + media_plugin_example + llwebrtc ) - #if (NOT USE_BUGSPLAT) - # LIST(APPEND COPY_INPUT_DEPENDENCIES linux-crash-logger) - #endif (NOT USE_BUGSPLAT) - add_custom_command( OUTPUT ${product}.tar.xz COMMAND ${PYTHON_EXECUTABLE} @@ -2356,7 +2425,7 @@ if (LINUX) if (PACKAGE) if (${LINUX_DISTRO} MATCHES arch) if (CMAKE_SYSTEM_PROCESSOR MATCHES x86_64) - set(ARCH_DEPS 'cef<151.3.23') + set(ARCH_DEPS 'cef<151.3.14') else () set(ARCH_DEPS "at-spi2-core minizip") endif () @@ -2378,10 +2447,10 @@ if (LINUX) set(CPACK_DEBIAN_PACKAGE_SECTION net CACHE STRING "Debian package section.") if (${LINUX_DISTRO} MATCHES debian) - 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, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + 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, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl3-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" CACHE STRING "Debian package dependencies.") else () - set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1t64, libboost-fiber1.90.0, libboost-filesystem1.90.0, libboost-program-options1.90.0, libboost-regex1.90.0, libboost-thread1.90.0, libboost-url1.90.0, libexpat1, libfltk1.4, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1t64, libboost-fiber1.90.0, libboost-filesystem1.90.0, libboost-process1.90.0, libboost-program-options1.90.0, libboost-regex1.90.0, libboost-thread1.90.0, libboost-url1.90.0, libexpat1, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl3-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" CACHE STRING "Debian package dependencies.") endif () elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) @@ -2399,10 +2468,10 @@ if (LINUX) set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} CACHE STRING "RPM package description.") if (${LINUX_DISTRO} MATCHES fedora) - set(CPACK_RPM_PACKAGE_REQUIRES "freealut, apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, cef, expat, fltk, mesa-libGLU, hunspell, minizip-ng-compat, libnghttp2, openjpeg, sdl2-compat, vlc-libs, vlc-plugins-base, libvorbis" + set(CPACK_RPM_PACKAGE_REQUIRES "freealut, apr-util, boost-fiber, boost-process, boost-program-options, boost-regex, boost-thread, boost-url, cef, expat, hunspell, minizip-ng-compat, libnghttp2, openjpeg, SDL3, vlc-libs, vlc-plugins-base, libvorbis" CACHE STRING "RPM package requirements.") else () - set(CPACK_RPM_PACKAGE_REQUIRES "libalut0, libapr-util1-0, libboost_fiber1_91_0, libboost_program_options1_91_0, libboost_regex1_91_0, libboost_thread1_91_0, libboost_url1_91_0, libboost_url1_91_0-x86-64-v3, libpng16-16 expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, libvorbis0" + set(CPACK_RPM_PACKAGE_REQUIRES "libalut0, libapr-util1-0, libboost_fiber1_91_0, libboost_process1_91_0, libboost_program_options1_91_0, libboost_regex1_91_0, libboost_thread1_91_0, libboost_url1_91_0, libboost_url1_91_0-x86-64-v3, libexpat1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libpng16-16, libSDL3-0, libvlc5, libvorbis0" CACHE STRING "RPM package requirements.") endif () endif () @@ -2459,7 +2528,7 @@ elseif (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE) 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" + set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;devel/apr;devel/boost-libs;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;devel/sdl3;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") endif (LINUX) @@ -2664,7 +2733,7 @@ if (LL_TESTS) lldateutil.cpp # llmediadataclient.cpp lllogininstance.cpp -# llremoteparcelrequest.cpp + llremoteparcelrequest.cpp llviewerhelputil.cpp llversioninfo.cpp # llvocache.cpp @@ -2689,21 +2758,24 @@ if (LL_TESTS) # ) set(test_libs - llcommon - llfilesystem - llxml - llmessage - llcharacter - llui - lllogin - llplugin - llappearance - ) + llfilesystem + llmath + llcommon + llmessage + llcorehttp + llxml + llui + llplugin + llappearance + llprimitive + lllogin + ) - set_source_files_properties( - llmediadataclient.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${test_libs}" + set_property(SOURCE + ${viewer_TEST_SOURCE_FILES} + PROPERTY + LL_TEST_ADDITIONAL_LIBRARIES + ${test_libs} ) set_source_files_properties( @@ -2715,66 +2787,39 @@ if (LL_TESTS) ) set_source_files_properties( - llmediadataclient.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES llprimitive - ) - - set_source_files_properties( lllogininstance.cpp PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES llversioninfo.cpp - ) - - set_property( SOURCE - ${viewer_TEST_SOURCE_FILES} - PROPERTY - LL_TEST_ADDITIONAL_LIBRARIES ${test_libs} + LL_TEST_ADDITIONAL_SOURCE_FILES + llversioninfo.cpp ) LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) - - set(test_libs - llfilesystem - llmath - llcommon - llmessage - llcorehttp - llxml - llui - llplugin - llappearance - lllogin - llprimitive - lllogin - ) - LL_ADD_INTEGRATION_TEST(cppfeatures "" "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llsechandler_basic llsechandler_basic.cpp "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llsecapi - llsecapi.cpp + llsecapi.cpp "${test_libs}" - ) + ) set(llslurl_test_sources - llslurl.cpp - llviewernetwork.cpp + llslurl.cpp + llviewernetwork.cpp ) LL_ADD_INTEGRATION_TEST(llslurl - "${llslurl_test_sources}" + "${llslurl_test_sources}" "${test_libs}" - ) + ) set(llviewercontrollistener_test_sources llviewercontrollistener.cpp @@ -2782,31 +2827,34 @@ if (LL_TESTS) ../llxml/llxmltree.cpp ../llxml/llxmlparser.cpp ../llcommon/commoncontrol.cpp - ) + ) LL_ADD_INTEGRATION_TEST(llviewercontrollistener "${llviewercontrollistener_test_sources}" "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llviewernetwork - llviewernetwork.cpp + llviewernetwork.cpp "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llviewerassetstats llviewerassetstats.cpp "${test_libs}" - ) - -# LL_ADD_INTEGRATION_TEST(llhttpretrypolicy "llhttpretrypolicy.cpp" "${test_libs}") - - #ADD_VIEWER_BUILD_TEST(llmemoryview viewer) - #ADD_VIEWER_BUILD_TEST(llagentaccess viewer) - #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) - #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) + ) + LL_ADD_INTEGRATION_TEST(llhttpretrypolicy "llhttpretrypolicy.cpp" "${test_libs}") + set(lltextureinfo_test_sources + lltextureinfo.cpp + ../llxml/llcontrol.cpp + ../llxml/llxmltree.cpp + ../llxml/llxmlparser.cpp + ../llcommon/commoncontrol.cpp + ) + LL_ADD_INTEGRATION_TEST(lltextureinfo "${lltextureinfo_test_sources}" "${test_libs}") + #LL_ADD_INTEGRATION_TEST(lltextureinfodetails "" "${test_libs}") test cases currently empty endif (LL_TESTS) check_message_template(${VIEWER_BINARY_NAME}) diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in index 6a73ab4f61..3dbe4cc8be 100644 --- a/indra/newview/FixBundle.cmake.in +++ b/indra/newview/FixBundle.cmake.in @@ -40,6 +40,11 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK + "../../../../Frameworks/libboost_date_time-mt.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_date_time-mt.dylib" + SYMBOLIC + ) +file(CREATE_LINK "../../../../Frameworks/libboost_fiber-mt.dylib" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_fiber-mt.dylib" SYMBOLIC @@ -50,6 +55,11 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK + "../../../../Frameworks/libboost_process-mt.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_process-mt.dylib" + SYMBOLIC + ) +file(CREATE_LINK "../../../../Frameworks/libboost_program_options-mt.dylib" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_program_options-mt.dylib" SYMBOLIC @@ -128,12 +138,18 @@ execute_process( COMMAND lipo libboost_context-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_context-mt.dylib + COMMAND lipo libboost_date_time-mt.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libboost_date_time-mt.dylib COMMAND lipo libboost_fiber-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_fiber-mt.dylib COMMAND lipo libboost_filesystem-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_filesystem-mt.dylib + COMMAND lipo libboost_process-mt.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libboost_process-mt.dylib COMMAND lipo libboost_program_options-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_program_options-mt.dylib diff --git a/indra/newview/FixPackage.cmake.in b/indra/newview/FixPackage.cmake.in index cb31a1a39d..26898a34d5 100644 --- a/indra/newview/FixPackage.cmake.in +++ b/indra/newview/FixPackage.cmake.in @@ -40,6 +40,11 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK + "../../../../Frameworks/libboost_date_time-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_date_time-mt.dylib" + SYMBOLIC + ) +file(CREATE_LINK "../../../../Frameworks/libboost_fiber-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_fiber-mt.dylib" SYMBOLIC @@ -50,6 +55,11 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK + "../../../../Frameworks/libboost_process-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_process-mt.dylib" + SYMBOLIC + ) +file(CREATE_LINK "../../../../Frameworks/libboost_program_options-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_program_options-mt.dylib" SYMBOLIC @@ -128,12 +138,18 @@ execute_process( COMMAND lipo libboost_context-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_context-mt.dylib + COMMAND lipo libboost_date_time-mt.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libboost_date_time-mt.dylib COMMAND lipo libboost_fiber-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_fiber-mt.dylib COMMAND lipo libboost_filesystem-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_filesystem-mt.dylib + COMMAND lipo libboost_process-mt.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libboost_process-mt.dylib COMMAND lipo libboost_program_options-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_program_options-mt.dylib diff --git a/indra/newview/Info-SecondLifeVorbis.plist b/indra/newview/Info-SecondLifeVorbis.plist deleted file mode 100644 index 9cb367eec1..0000000000 --- a/indra/newview/Info-SecondLifeVorbis.plist +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleExecutable</key> - <string>SecondLifeVorbis</string> - <key>CFBundleGetInfoString</key> - <string></string> - <key>CFBundleIconFile</key> - <string></string> - <key>CFBundleIdentifier</key> - <string>com.secondlife.indra.vorbis</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundleName</key> - <string>SecondLifeVorbis</string> - <key>CFBundlePackageType</key> - <string>FMWK</string> - <key>CFBundleShortVersionString</key> - <string></string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleVersion</key> - <string>0.0.1d1</string> -</dict> -</plist> diff --git a/indra/newview/PKGBUILD.in b/indra/newview/PKGBUILD.in index 8b57e62f58..5c7b7f827a 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=(freealut apr-util boost-libs fltk glu hunspell libnghttp2 openjpeg2 sdl2 vlc libvorbis ${ARCH_DEPS}) +depends=(freealut apr-util boost-libs hunspell libnghttp2 openjpeg2 sdl3 vlc libvorbis ${ARCH_DEPS}) package() { cd "$startdir" diff --git a/indra/newview/SignBundle.cmake.in b/indra/newview/SignBundle.cmake.in index eacc24af67..10446d7f52 100644 --- a/indra/newview/SignBundle.cmake.in +++ b/indra/newview/SignBundle.cmake.in @@ -11,8 +11,10 @@ execute_process( Frameworks/libaprutil-1.0.dylib Frameworks/libboost_atomic-mt.dylib Frameworks/libboost_context-mt.dylib + Frameworks/libboost_date_time-mt.dylib Frameworks/libboost_fiber-mt.dylib Frameworks/libboost_filesystem-mt.dylib + Frameworks/libboost_process-mt.dylib Frameworks/libboost_program_options-mt.dylib Frameworks/libboost_regex-mt.dylib Frameworks/libboost_system-mt.dylib diff --git a/indra/newview/SignPackage.cmake.in b/indra/newview/SignPackage.cmake.in index 090891a870..2350735f78 100644 --- a/indra/newview/SignPackage.cmake.in +++ b/indra/newview/SignPackage.cmake.in @@ -11,8 +11,10 @@ execute_process( Frameworks/libaprutil-1.0.dylib Frameworks/libboost_atomic-mt.dylib Frameworks/libboost_context-mt.dylib + Frameworks/libboost_date_time-mt.dylib Frameworks/libboost_fiber-mt.dylib Frameworks/libboost_filesystem-mt.dylib + Frameworks/libboost_process-mt.dylib Frameworks/libboost_program_options-mt.dylib Frameworks/libboost_regex-mt.dylib Frameworks/libboost_system-mt.dylib diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index c4697fd566..bb6eac98a9 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -26.3.0 +26.4.0 diff --git a/indra/newview/VertexCache.h b/indra/newview/VertexCache.h deleted file mode 100644 index edb231feb1..0000000000 --- a/indra/newview/VertexCache.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file VertexCache.h - * @brief VertexCache class definition - * - * $LicenseInfo:firstyear=2002&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 VERTEX_CACHE_H - -#define VERTEX_CACHE_H - -class VertexCache -{ - -public: - - VertexCache(int size) - { - numEntries = size; - - entries = new int[numEntries]; - - for(int i = 0; i < numEntries; i++) - entries[i] = -1; - } - - VertexCache() { VertexCache(16); } - ~VertexCache() { delete[] entries; entries = 0; } - - bool InCache(int entry) - { - bool returnVal = false; - for(int i = 0; i < numEntries; i++) - { - if(entries[i] == entry) - { - returnVal = true; - break; - } - } - - return returnVal; - } - - int AddEntry(int entry) - { - int removed; - - removed = entries[numEntries - 1]; - - //push everything right one - for(int i = numEntries - 2; i >= 0; i--) - { - entries[i + 1] = entries[i]; - } - - entries[0] = entry; - - return removed; - } - - void Clear() - { - memset(entries, -1, sizeof(int) * numEntries); - } - - void Copy(VertexCache* inVcache) - { - for(int i = 0; i < numEntries; i++) - { - inVcache->Set(i, entries[i]); - } - } - - int At(int index) { return entries[index]; } - void Set(int index, int value) { entries[index] = value; } - -private: - - int *entries; - int numEntries; - -}; - -#endif diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake index 440c72c561..ee71ecfd46 100644 --- a/indra/newview/ViewerInstall.cmake +++ b/indra/newview/ViewerInstall.cmake @@ -174,6 +174,7 @@ elseif (WINDOWS) ${prefix_result}/../bin/boost_fiber${BOOST_DLL_SFX}.dll ${prefix_result}/../bin/boost_filesystem${BOOST_DLL_SFX}.dll ${prefix_result}/../bin/boost_json${BOOST_DLL_SFX}.dll + ${prefix_result}/../bin/boost_process${BOOST_DLL_SFX}.dll ${prefix_result}/../bin/boost_program_options${BOOST_DLL_SFX}.dll ${prefix_result}/../bin/boost_thread${BOOST_DLL_SFX}.dll ${prefix_result}/../bin/boost_url${BOOST_DLL_SFX}.dll diff --git a/indra/newview/VorbisFramework.h b/indra/newview/VorbisFramework.h deleted file mode 100644 index 7ee9a8c411..0000000000 --- a/indra/newview/VorbisFramework.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file VorbisFramework.h - * @author Dave Camp - * @date Fri Oct 10 2003 - * @brief For the Macview project - * - * $LicenseInfo:firstyear=2003&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "ogg/ogg.h" -#include "vorbis/codec.h" -#include "vorbis/vorbisenc.h" - -extern int mac_vorbis_analysis(vorbis_block *vb,ogg_packet *op); - -extern int mac_vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code); - -extern int mac_vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); - -extern int mac_vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); - -extern int mac_vorbis_encode_setup_init(vorbis_info *vi); - -extern int mac_vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -extern void mac_vorbis_info_init(vorbis_info *vi); -extern void mac_vorbis_info_clear(vorbis_info *vi); -extern void mac_vorbis_comment_init(vorbis_comment *vc); -extern void mac_vorbis_comment_clear(vorbis_comment *vc); -extern int mac_vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); -extern int mac_vorbis_block_clear(vorbis_block *vb); -extern void mac_vorbis_dsp_clear(vorbis_dsp_state *v); -extern float **mac_vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); -extern int mac_vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); -extern int mac_vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); - -extern int mac_ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); -extern int mac_ogg_stream_init(ogg_stream_state *os,int serialno); -extern int mac_ogg_stream_flush(ogg_stream_state *os, ogg_page *og); -extern int mac_ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); -extern int mac_ogg_page_eos(ogg_page *og); -extern int mac_ogg_stream_clear(ogg_stream_state *os); - - -#ifdef __cplusplus -} -#endif diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index e16a5c7e76..bf7f9bab1f 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -90,6 +90,12 @@ <string>ConnectAsGod</string> </map> + <key>gpubenchmark</key> + <map> + <key>desc</key> + <string>Run GPU memory bandwidth benchmark, print result to stdout, and exit. Used internally by the viewer to isolate benchmark from the main process.</string> + </map> + <key>graphicslevel</key> <map> <key>desc</key> diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 51372e2d16..eb31c5a301 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -83,16 +83,6 @@ is_running_function="Floater.IsOpen" is_running_parameters="gestures" /> - <command name="howto" - available_in_toybox="true" - icon="Command_HowTo_Icon" - label_ref="Command_HowTo_Label" - tooltip_ref="Command_HowTo_Tooltip" - execute_function="Floater.ToggleOrBringToFront" - execute_parameters="guidebook" - is_running_function="Floater.IsOpen" - is_running_parameters="guidebook" - /> <command name="inventory" available_in_toybox="true" icon="Command_Inventory_Icon" diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml deleted file mode 100644 index f99b86bd39..0000000000 --- a/indra/newview/app_settings/keywords_lsl_default.xml +++ /dev/null @@ -1,19161 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<llsd> - <map> - <key>controls</key> - <map> - <key>do</key> - <map> - <key>tooltip</key> - <string>do / while loop\ndo {\n...\n} while (<condition>);</string> - </map> - <key>else</key> - <map> - <key>tooltip</key> - <string>if / else block\nif (<condition>) {\n...\n[} else [if (<condition>) {\n...]]\n}</string> - </map> - <key>for</key> - <map> - <key>tooltip</key> - <string>for loop\nfor (<initializer>; <condition>; <post-iteration-statement>)\n{ ...\n}</string> - </map> - <key>if</key> - <map> - <key>tooltip</key> - <string>if / else block\nif (<condition>) {\n...\n[} else [if (<condition>) {\n...]]\n}</string> - </map> - <key>jump</key> - <map> - <key>tooltip</key> - <string>jump statement\njump <label></string> - </map> - <key>return</key> - <map> - <key>tooltip</key> - <string>Leave current event or function.\nreturn [<variable>];\nOptionally pass back a variable's value, from a function.</string> - </map> - <key>state</key> - <map> - <key>tooltip</key> - <string>state <target>\nIf the target state is not the same as the current one, change to the target state.</string> - </map> - <key>while</key> - <map> - <key>tooltip</key> - <string>while loop\nwhile (<condition>) {\n,,,\n}</string> - </map> - </map> - <key>types</key> - <map> - <key>float</key> - <map> - <key>tooltip</key> - <string>32 bit floating point value.\nThe range is 1.175494351E-38 to 3.402823466E+38.</string> - </map> - <key>integer</key> - <map> - <key>tooltip</key> - <string>32 bit integer value.\n−2,147,483,648 and +2,147,483,647 (that is 0x80000000 to 0x7FFFFFFF in hex).</string> - </map> - <key>key</key> - <map> - <key>tooltip</key> - <string>A 128 bit unique identifier (UUID).\nThe key is represented as hexidecimal characters (A-F and 0-9), grouped into sections (8,4,4,4,12 characters) and separated by hyphens (for a total of 36 characters). e.g. "A822FF2B-FF02-461D-B45D-DCD10A2DE0C2".</string> - </map> - <key>list</key> - <map> - <key>tooltip</key> - <string>A collection of other data types.\nLists are signified by square brackets surrounding their elements; the elements inside are separated by commas. e.g. [0, 1, 2, 3, 4] or ["Yes", "No", "Perhaps"].</string> - </map> - <key>quaternion</key> - <map> - <key>tooltip</key> - <string>The quaternion type is a left over from way back when LSL was created. It was later renamed to <rotation> to make it more user friendly, but it appears someone forgot to remove it ;-)</string> - </map> - <key>rotation</key> - <map> - <key>tooltip</key> - <string>The rotation type is one of several ways to represent an orientation in 3D.\nIt is a mathematical object called a quaternion. You can think of a quaternion as four numbers (x, y, z, w), three of which represent the direction an object is facing and a fourth that represents the object's banking left or right around that direction.</string> - </map> - <key>string</key> - <map> - <key>tooltip</key> - <string>Text data.\nThe editor accepts UTF-8 encoded text.</string> - </map> - <key>vector</key> - <map> - <key>tooltip</key> - <string>A vector is a data type that contains a set of three float values.\nVectors are used to represent colors (RGB), positions, and directions/velocities.</string> - </map> - </map> - <key>constants</key> - <map> - <key>ACTIVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>Objects in world that are running a script or currently physically moving.</string> - </map> - <key>AGENT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Objects in world that are agents.</string> - </map> - <key>AGENT_ALWAYS_RUN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1000</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_ATTACHMENTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>The agent has attachments.</string> - </map> - <key>AGENT_AUTOPILOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2000</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_AWAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_BUSY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x800</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_BY_LEGACY_NAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_BY_USERNAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_CROUCHING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_FLYING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>The agent is flying.</string> - </map> - <key>AGENT_IN_AIR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_LIST_PARCEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Agents on the same parcel where the script is running.</string> - </map> - <key>AGENT_LIST_PARCEL_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Agents on any parcel in the region where the parcel owner is the same as the owner of the parcel under the scripted object.</string> - </map> - <key>AGENT_LIST_REGION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>All agents in the region.</string> - </map> - <key>AGENT_MOUSELOOK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_ON_OBJECT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_SCRIPTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>The agent has scripted attachments.</string> - </map> - <key>AGENT_SITTING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_TYPING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string/> - </map> - <key>AGENT_WALKING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string/> - </map> - <key>ALL_SIDES</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>ANIM_ON</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Texture animation is on.</string> - </map> - <key>ATTACH_AVATAR_CENTER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>40</integer> - <key>tooltip</key> - <string>Attach to the avatar's geometric centre.</string> - </map> - <key>ATTACH_BACK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string>Attach to the avatar's back.</string> - </map> - <key>ATTACH_BELLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>28</integer> - <key>tooltip</key> - <string>Attach to the avatar's belly.</string> - </map> - <key>ATTACH_CHEST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Attach to the avatar's chest.</string> - </map> - <key>ATTACH_CHIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>Attach to the avatar's chin.</string> - </map> - <key>ATTACH_HEAD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Attach to the avatar's head.</string> - </map> - <key>ATTACH_HUD_BOTTOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>37</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_BOTTOM_LEFT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>36</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_BOTTOM_RIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>38</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_CENTER_1</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>35</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_CENTER_2</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>31</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_TOP_CENTER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>33</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_TOP_LEFT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>34</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_HUD_TOP_RIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>32</integer> - <key>tooltip</key> - <string/> - </map> - <key>ATTACH_LEAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>Attach to the avatar's left ear.</string> - </map> - <key>ATTACH_LEFT_PEC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>29</integer> - <key>tooltip</key> - <string>Attach to the avatar's left pectoral.</string> - </map> - <key>ATTACH_LEYE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string>Attach to the avatar's left eye.</string> - </map> - <key>ATTACH_LFOOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>Attach to the avatar's left foot.</string> - </map> - <key>ATTACH_LHAND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Attach to the avatar's left hand.</string> - </map> - <key>ATTACH_LHIP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>25</integer> - <key>tooltip</key> - <string>Attach to the avatar's left hip.</string> - </map> - <key>ATTACH_LLARM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string>Attach to the avatar's left lower arm.</string> - </map> - <key>ATTACH_LLLEG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>27</integer> - <key>tooltip</key> - <string>Attach to the avatar's lower left leg.</string> - </map> - <key>ATTACH_LPEC</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>30</integer> - <key>tooltip</key> - <string>Attach to the avatar's right pectoral. (Deprecated, use ATTACH_RIGHT_PEC)</string> - </map> - <key>ATTACH_LSHOULDER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Attach to the avatar's left shoulder.</string> - </map> - <key>ATTACH_LUARM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string>Attach to the avatar's left upper arm.</string> - </map> - <key>ATTACH_LULEG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>26</integer> - <key>tooltip</key> - <string>Attach to the avatar's lower upper leg.</string> - </map> - <key>ATTACH_MOUTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string>Attach to the avatar's mouth.</string> - </map> - <key>ATTACH_NECK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>39</integer> - <key>tooltip</key> - <string>Attach to the avatar's neck.</string> - </map> - <key>ATTACH_NOSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string>Attach to the avatar's nose.</string> - </map> - <key>ATTACH_PELVIS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>Attach to the avatar's pelvis.</string> - </map> - <key>ATTACH_REAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string>Attach to the avatar's right ear.</string> - </map> - <key>ATTACH_REYE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string>Attach to the avatar's right eye.</string> - </map> - <key>ATTACH_RFOOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>Attach to the avatar's right foot.</string> - </map> - <key>ATTACH_RHAND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Attach to the avatar's right hand.</string> - </map> - <key>ATTACH_RHIP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>22</integer> - <key>tooltip</key> - <string>Attach to the avatar's right hip.</string> - </map> - <key>ATTACH_RIGHT_PEC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>30</integer> - <key>tooltip</key> - <string>Attach to the avatar's right pectoral.</string> - </map> - <key>ATTACH_RLARM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>19</integer> - <key>tooltip</key> - <string>Attach to the avatar's right lower arm.</string> - </map> - <key>ATTACH_RLLEG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>24</integer> - <key>tooltip</key> - <string>Attach to the avatar's right lower leg.</string> - </map> - <key>ATTACH_RPEC</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>29</integer> - <key>tooltip</key> - <string>Attach to the avatar's left pectoral. (deprecated, use ATTACH_LEFT_PEC)</string> - </map> - <key>ATTACH_RSHOULDER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Attach to the avatar's right shoulder.</string> - </map> - <key>ATTACH_RUARM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>18</integer> - <key>tooltip</key> - <string>Attach to the avatar's right upper arm.</string> - </map> - <key>ATTACH_RULEG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>23</integer> - <key>tooltip</key> - <string>Attach to the avatar's right upper leg.</string> - </map> - <key>ATTACH_LHAND_RING1</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>41</integer> - <key>tooltip</key> - <string>Attach to the avatar's left ring finger.</string> - </map> - <key>ATTACH_RHAND_RING1</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>42</integer> - <key>tooltip</key> - <string>Attach to the avatar's right ring finger.</string> - </map> - <key>ATTACH_TAIL_BASE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>43</integer> - <key>tooltip</key> - <string>Attach to the avatar's tail base.</string> - </map> - <key>ATTACH_TAIL_TIP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>44</integer> - <key>tooltip</key> - <string>Attach to the avatar's tail tip.</string> - </map> - <key>ATTACH_LWING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>45</integer> - <key>tooltip</key> - <string>Attach to the avatar's left wing.</string> - </map> - <key>ATTACH_RWING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>46</integer> - <key>tooltip</key> - <string>Attach to the avatar's right wing.</string> - </map> - <key>ATTACH_FACE_JAW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>47</integer> - <key>tooltip</key> - <string>Attach to the avatar's jaw.</string> - </map> - <key>ATTACH_FACE_LEAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>48</integer> - <key>tooltip</key> - <string>Attach to the avatar's left ear (extended).</string> - </map> - <key>ATTACH_FACE_REAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>49</integer> - <key>tooltip</key> - <string>Attach to the avatar's right ear (extended).</string> - </map> - <key>ATTACH_FACE_LEYE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>50</integer> - <key>tooltip</key> - <string>Attach to the avatar's left eye (extended).</string> - </map> - <key>ATTACH_FACE_REYE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>51</integer> - <key>tooltip</key> - <string>Attach to the avatar's right eye (extended).</string> - </map> - <key>ATTACH_FACE_TONGUE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>52</integer> - <key>tooltip</key> - <string>Attach to the avatar's tongue.</string> - </map> - <key>ATTACH_GROIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>53</integer> - <key>tooltip</key> - <string>Attach to the avatar's groin.</string> - </map> - <key>ATTACH_HIND_LFOOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>54</integer> - <key>tooltip</key> - <string>Attach to the avatar's left hind foot.</string> - </map> - <key>ATTACH_HIND_RFOOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>55</integer> - <key>tooltip</key> - <string>Attach to the avatar's right hind foot.</string> - </map> - <key>AVOID_CHARACTERS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>AVOID_DYNAMIC_OBSTACLES</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>AVOID_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_ACTIVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_BEHINDNESS_ANGLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_BEHINDNESS_LAG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_DISTANCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_FOCUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_FOCUS_LAG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_FOCUS_LOCKED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>22</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_FOCUS_OFFSET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_FOCUS_THRESHOLD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_PITCH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_POSITION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_POSITION_LAG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_POSITION_LOCKED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string/> - </map> - <key>CAMERA_POSITION_THRESHOLD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_ALLOWED_DROP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>The object inventory has changed because an item was added through the llAllowInventoryDrop interface.</string> - </map> - <key>CHANGED_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>The object color has changed.</string> - </map> - <key>CHANGED_INVENTORY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>The object inventory has changed.</string> - </map> - <key>CHANGED_LINK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>The object has linked or its links were broken.</string> - </map> - <key>CHANGED_MEDIA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x800</string> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_REGION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_REGION_START</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_SCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>The object scale (size) has changed.</string> - </map> - <key>CHANGED_SHAPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>The object base shape has changed, e.g., a box to a cylinder.</string> - </map> - <key>CHANGED_TELEPORT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string/> - </map> - <key>CHANGED_TEXTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>The texture offset, scale rotation, or simply the object texture has changed.</string> - </map> - <key>CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string>If set to false, character will not attempt to catch up on lost time when pathfinding performance is low, potentially providing more reliable movement (albeit while potentially appearing to be more stuttery). Default is true to match pre-existing behavior.</string> - </map> - <key>CHARACTER_AVOIDANCE_MODE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Allows you to specify that a character should not try to avoid other characters, should not try to avoid dynamic obstacles (relatively fast moving objects and avatars), or both.</string> - </map> - <key>CHARACTER_CMD_JUMP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x01</string> - <key>tooltip</key> - <string>Makes the character jump. Requires an additional parameter, the height to jump, between 0.1m and 2.0m. This must be provided as the first element of the llExecCharacterCmd option list.</string> - </map> - <key>CHARACTER_CMD_SMOOTH_STOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHARACTER_CMD_STOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x00</string> - <key>tooltip</key> - <string>Stops any current pathfinding operation.</string> - </map> - <key>CHARACTER_DESIRED_SPEED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Speed of pursuit in meters per second.</string> - </map> - <key>CHARACTER_DESIRED_TURN_SPEED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>The character's maximum speed while turning about the Z axis. - Note that this is only loosely enforced.</string> - </map> - <key>CHARACTER_LENGTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Set collision capsule length - cannot be less than two times the radius.</string> - </map> - <key>CHARACTER_MAX_ACCEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>The character's maximum acceleration rate.</string> - </map> - <key>CHARACTER_MAX_DECEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string>The character's maximum deceleration rate.</string> - </map> - <key>CHARACTER_MAX_SPEED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>The character's maximum speed.</string> - </map> - <key>CHARACTER_MAX_TURN_RADIUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>The character's turn radius when travelling at CHARACTER_MAX_TURN_SPEED.</string> - </map> - <key>CHARACTER_ORIENTATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Valid options are: VERTICAL, HORIZONTAL.</string> - </map> - <key>CHARACTER_RADIUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Set collision capsule radius.</string> - </map> - <key>CHARACTER_STAY_WITHIN_PARCEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string>Determines whether a character can leave its starting parcel.\nTakes a boolean parameter. If TRUE, the character cannot voluntarilly leave the parcel, but can return to it.</string> - </map> - <key>CHARACTER_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Specifies which walk-ability coefficient will be used by this character.</string> - </map> - <key>CHARACTER_TYPE_A</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHARACTER_TYPE_B</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHARACTER_TYPE_C</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHARACTER_TYPE_D</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>CHARACTER_TYPE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>CLICK_ACTION_BUY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>When the prim is clicked, the buy dialog is opened.</string> - </map> - <key>CLICK_ACTION_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Performs the default action: when the prim is clicked, touch events are triggered.</string> - </map> - <key>CLICK_ACTION_OPEN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>When the prim is clicked, the object inventory dialog is opened.</string> - </map> - <key>CLICK_ACTION_OPEN_MEDIA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>When the prim is touched, the web media dialog is opened.</string> - </map> - <key>CLICK_ACTION_PAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>When the prim is clicked, the pay dialog is opened.</string> - </map> - <key>CLICK_ACTION_PLAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>When the prim is clicked, html-on-a-prim is enabled?</string> - </map> - <key>CLICK_ACTION_SIT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>When the prim is clicked, the avatar sits upon it.</string> - </map> - <key>CLICK_ACTION_TOUCH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>When the prim is clicked, touch events are triggered.</string> - </map> - <key>CONTENT_TYPE_ATOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>"application/atom+xml"</string> - </map> - <key>CONTENT_TYPE_FORM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>"application/x-www-form-urlencoded"</string> - </map> - <key>CONTENT_TYPE_HTML</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>"text/html", only valid for embedded browsers on content owned by the person viewing. Falls back to "text/plain" otherwise.</string> - </map> - <key>CONTENT_TYPE_JSON</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>"application/json"</string> - </map> - <key>CONTENT_TYPE_LLSD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>"application/llsd+xml"</string> - </map> - <key>CONTENT_TYPE_RSS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>"application/rss+xml"</string> - </map> - <key>CONTENT_TYPE_TEXT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>"text/plain"</string> - </map> - <key>CONTENT_TYPE_XHTML</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>"application/xhtml+xml"</string> - </map> - <key>CONTENT_TYPE_XML</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>"application/xml"</string> - </map> - <key>CONTROL_BACK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>Test for the avatar move back control.</string> - </map> - <key>CONTROL_DOWN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>Test for the avatar move down control.</string> - </map> - <key>CONTROL_FWD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Test for the avatar move forward control.</string> - </map> - <key>CONTROL_LBUTTON</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10000000</string> - <key>tooltip</key> - <string>Test for the avatar left button control.</string> - </map> - <key>CONTROL_LEFT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>Test for the avatar move left control.</string> - </map> - <key>CONTROL_ML_LBUTTON</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40000000</string> - <key>tooltip</key> - <string>Test for the avatar left button control while in mouse look.</string> - </map> - <key>CONTROL_RIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Test for the avatar move right control.</string> - </map> - <key>CONTROL_ROT_LEFT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string>Test for the avatar rotate left control.</string> - </map> - <key>CONTROL_ROT_RIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string>Test for the avatar rotate right control.</string> - </map> - <key>CONTROL_UP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>Test for the avatar move up control.</string> - </map> - <key>DATA_BORN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>The date the agent was born, returned in ISO 8601 format of YYYY-MM-DD.</string> - </map> - <key>DATA_NAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>The name of the agent.</string> - </map> - <key>DATA_ONLINE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>TRUE for online, FALSE for offline.</string> - </map> - <key>DATA_PAYINFO</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>DATA_RATING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Returns the agent ratings as a comma separated string of six integers. They are: - 1) Positive rated behaviour - 2) Negative rated behaviour - 3) Positive rated appearance - 4) Negative rated appearance - 5) Positive rated building - 6) Negative rated building</string> - </map> - <key>DATA_SIM_POS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>DATA_SIM_RATING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>DATA_SIM_STATUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>DEBUG_CHANNEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2147483647</integer> - <key>tooltip</key> - <string>DEBUG_CHANNEL is an integer constant that, when passed to llSay, llWhisper, or llShout as a channel parameter, will print text to the Script Warning/Error Window.</string> - </map> - <key>DEG_TO_RAD</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>0.017453293</real> - <key>tooltip</key> - <string>0.017453293 - Number of radians per degree. - You can use this to convert degrees to radians by multiplying the degrees by this number.</string> - </map> - <key>DENSITY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Used with llSetPhysicsMaterial to enable the density value. Must be between 1.0 and 22587.0 (in Kg/m^3 -- see if you can figure out what 22587 represents)</string> - </map> - <key>EOF</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>\\n\\n\\n</string> - <key>tooltip</key> - <string>Indicates the last line of a notecard was read.</string> - </map> - <key>ERR_GENERIC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>ERR_MALFORMED_PARAMS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-3</integer> - <key>tooltip</key> - <string/> - </map> - <key>ERR_PARCEL_PERMISSIONS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-2</integer> - <key>tooltip</key> - <string/> - </map> - <key>ERR_RUNTIME_PERMISSIONS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-4</integer> - <key>tooltip</key> - <string/> - </map> - <key>ERR_THROTTLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-5</integer> - <key>tooltip</key> - <string/> - </map> - <key>ESTATE_ACCESS_ALLOWED_AGENT_ADD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Add the agent to this estate's Allowed Residents list.</string> - </map> - <key>ESTATE_ACCESS_ALLOWED_AGENT_REMOVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>Remove the agent from this estate's Allowed Residents list.</string> - </map> - <key>ESTATE_ACCESS_ALLOWED_GROUP_ADD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string>Add the group to this estate's Allowed groups list.</string> - </map> - <key>ESTATE_ACCESS_ALLOWED_GROUP_REMOVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>32</integer> - <key>tooltip</key> - <string>Remove the group from this estate's Allowed groups list.</string> - </map> - <key>ESTATE_ACCESS_BANNED_AGENT_ADD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>64</integer> - <key>tooltip</key> - <string>Add the agent to this estate's Banned residents list.</string> - </map> - <key>ESTATE_ACCESS_BANNED_AGENT_REMOVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>128</integer> - <key>tooltip</key> - <string>Remove the agent from this estate's Banned residents list.</string> - </map> - <key>FALSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>An integer constant for boolean comparisons. Has the value '0'.</string> - </map> - <key>FORCE_DIRECT_PATH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Makes character navigate in a straight line toward position. May be set to TRUE or FALSE.</string> - </map> - <key>FRICTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Used with llSetPhysicsMaterial to enable the friction value. Must be between 0.0 and 255.0</string> - </map> - <key>GCNP_RADIUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>GCNP_STATIC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>GRAVITY_MULTIPLIER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>Used with llSetPhysicsMaterial to enable the gravity multiplier value. Must be between -1.0 and +28.0</string> - </map> - <key>HORIZONTAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_BODY_MAXLENGTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_BODY_TRUNCATED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_CUSTOM_HEADER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Add an extra custom HTTP header to the request. The first string is the name of the parameter to change, e.g. "Pragma", and the second string is the value, e.g. "no-cache". Up to 8 custom headers may be configured per request. Note that certain headers, such as the default headers, are blocked for security reasons.</string> - </map> - <key>HTTP_METHOD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_MIMETYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_PRAGMA_NO_CACHE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Allows enabling/disbling of the "Pragma: no-cache" header.\nUsage: [HTTP_PRAGMA_NO_CACHE, integer SendHeader]. When SendHeader is TRUE, the "Pragma: no-cache" header is sent by the script. This matches the default behavior. When SendHeader is FALSE, no "Pragma" header is sent by the script.</string> - </map> - <key>HTTP_VERBOSE_THROTTLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>HTTP_VERIFY_CERT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_ALL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_ANIMATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_BODYPART</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_CLOTHING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_GESTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_LANDMARK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_NOTECARD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_OBJECT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_SCRIPT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_SETTING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>56</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_SOUND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_TEXTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>INVENTORY_MATERIAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>57</integer> - <key>tooltip</key> - <string/> - </map> - <key>JSON_APPEND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>JSON_ARRAY</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD2</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_DELETE</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD8</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_FALSE</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD7</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_INVALID</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD0</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_NULL</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD5</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_NUMBER</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD3</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_OBJECT</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD1</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_STRING</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD4</string> - <key>tooltip</key> - <string/> - </map> - <key>JSON_TRUE</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>U+FDD6</string> - <key>tooltip</key> - <string/> - </map> - <key>KFM_CMD_PAUSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>For use with KFM_COMMAND.</string> - </map> - <key>KFM_CMD_PLAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>For use with KFM_COMMAND.</string> - </map> - <key>KFM_CMD_STOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>For use with KFM_COMMAND.</string> - </map> - <key>KFM_COMMAND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>KFM_DATA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>KFM_FORWARD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>For use with KFM_MODE.</string> - </map> - <key>KFM_LOOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>For use with KFM_MODE.</string> - </map> - <key>KFM_MODE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>KFM_PING_PONG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>For use with KFM_MODE.</string> - </map> - <key>KFM_REVERSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>For use with KFM_MODE.</string> - </map> - <key>KFM_ROTATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>For use with KFM_DATA.</string> - </map> - <key>KFM_TRANSLATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>For use with KFM_DATA.</string> - </map> - <key>LAND_LARGE_BRUSH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Use a large brush size.\nNOTE: This value is incorrect, a large brush should be 2.</string> - </map> - <key>LAND_LEVEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Action to level the land.</string> - </map> - <key>LAND_LOWER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Action to lower the land.</string> - </map> - <key>LAND_MEDIUM_BRUSH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Use a medium brush size.\nNOTE: This value is incorrect, a medium brush should be 1.</string> - </map> - <key>LAND_NOISE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>LAND_RAISE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Action to raise the land.</string> - </map> - <key>LAND_REVERT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>LAND_SMALL_BRUSH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Use a small brush size.\nNOTE: This value is incorrect, a small brush should be 0.</string> - </map> - <key>LAND_SMOOTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>LINK_ALL_CHILDREN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-3</integer> - <key>tooltip</key> - <string>This targets every object except the root in the linked set.</string> - </map> - <key>LINK_ALL_OTHERS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-2</integer> - <key>tooltip</key> - <string>This targets every object in the linked set except the object with the script.</string> - </map> - <key>LINK_ROOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>This targets the root of the linked set.</string> - </map> - <key>LINK_SET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string>This targets every object in the linked set.</string> - </map> - <key>LINK_THIS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-4</integer> - <key>tooltip</key> - <string>The link number of the prim containing the script.</string> - </map> - <key>LIST_STAT_GEOMETRIC_MEAN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_MAX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_MEAN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_MEDIAN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_MIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_NUM_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_RANGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_STD_DEV</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_SUM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>LIST_STAT_SUM_SQUARES</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>LOOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>Loop the texture animation.</string> - </map> - <key>MASK_BASE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>MASK_EVERYONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>MASK_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>MASK_NEXT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>MASK_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>NULL_KEY</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>00000000-0000-0000-0000-000000000000</uuid> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_ATTACHED_POINT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>19</integer> - <key>tooltip</key> - <string>Gets the attachment point to which the object is attached.\nReturns 0 if the object is not an attachment (or is an avatar, etc).</string> - </map> - <key>OBJECT_BODY_SHAPE_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>26</integer> - <key>tooltip</key> - <string>This is a flag used with llGetObjectDetails to get the body type of the avatar, based on shape data.\nIf no data is available, -1.0 is returned.\nThis is normally between 0 and 1.0, with 0.5 and larger considered 'male'</string> - </map> - <key>OBJECT_CHARACTER_TIME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string>Units in seconds</string> - </map> - <key>OBJECT_CLICK_ACTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>28</integer> - <key>tooltip</key> - <string>This is a flag used with llGetObjectDetails to get the click action.\nThe default is 0</string> - </map> - <key>OBJECT_CREATOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>Gets the object's creator key. If id is an avatar, a NULL_KEY is returned.</string> - </map> - <key>OBJECT_DESC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Gets the object's description. If id is an avatar, an empty string is returned.</string> - </map> - <key>OBJECT_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>Gets the prims's group key. If id is an avatar, a NULL_KEY is returned.</string> - </map> - <key>OBJECT_HOVER_HEIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>25</integer> - <key>tooltip</key> - <string>This is a flag used with llGetObjectDetails to get hover height of the avatar\nIf no data is available, 0.0 is returned.</string> - </map> - <key>OBJECT_LAST_OWNER_ID</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>27</integer> - <key>tooltip</key> - <string>Gets the object's last owner ID.</string> - </map> - <key>OBJECT_NAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Gets the object's name.</string> - </map> - <key>OBJECT_OMEGA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>29</integer> - <key>tooltip</key> - <string>Gets an object's angular velocity.</string> - </map> - <key>OBJECT_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Gets an object's owner's key. If id is group owned, a NULL_KEY is returned.</string> - </map> - <key>OBJECT_PRIM_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>30</integer> - <key>tooltip</key> - <string>Gets the prim count of the object. The script and target object must be owned by the same owner</string> - </map> - <key>OBJECT_PATHFINDING_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string>Returns the pathfinding setting of any object in the region. It returns an integer matching one of the OPT_* constants.</string> - </map> - <key>OBJECT_PHANTOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>22</integer> - <key>tooltip</key> - <string>Returns boolean, detailing if phantom is enabled or disabled on the object.\nIf id is an avatar or attachment, 0 is returned.</string> - </map> - <key>OBJECT_PHYSICS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string>Returns boolean, detailing if physics is enabled or disabled on the object.\nIf id is an avatar or attachment, 0 is returned.</string> - </map> - <key>OBJECT_PHYSICS_COST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_POS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Gets the object's position in region coordinates.</string> - </map> - <key>OBJECT_PRIM_EQUIVALENCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_RENDER_WEIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>24</integer> - <key>tooltip</key> - <string>This is a flag used with llGetObjectDetails to get the Avatar_Rendering_Cost of an avatar, based on values reported by nearby viewers.\nIf no data is available, -1 is returned.\nThe maximum render weight stored by the simulator is 500000. When called against an object, 0 is returned.</string> - </map> - <key>OBJECT_RETURN_PARCEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_RETURN_PARCEL_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_RETURN_REGION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_REZZER_KEY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>32</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_ROOT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>18</integer> - <key>tooltip</key> - <string>Gets the id of the root prim of the object requested.\nIf id is an avatar, return the id of the root prim of the linkset the avatar is sitting on (or the avatar's own id if the avatar is not sitting on an object within the region).</string> - </map> - <key>OBJECT_ROT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Gets the object's rotation.</string> - </map> - <key>OBJECT_RUNNING_SCRIPT_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_SCRIPT_MEMORY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_SCRIPT_TIME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_SERVER_COST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_STREAMING_COST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_TEMP_ON_REZ</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>23</integer> - <key>tooltip</key> - <string>Returns boolean, detailing if temporary is enabled or disabled on the object.</string> - </map> - <key>OBJECT_TOTAL_INVENTORY_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>31</integer> - <key>tooltip</key> - <string>Gets the total inventory count of the object. The script and target object must be owned by the same owner</string> - </map> - <key>OBJECT_TOTAL_SCRIPT_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_UNKNOWN_DETAIL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>OBJECT_VELOCITY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Gets the object's velocity.</string> - </map> - <key>OPT_AVATAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Returned for avatars.</string> - </map> - <key>OPT_CHARACTER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Returned for pathfinding characters.</string> - </map> - <key>OPT_EXCLUSION_VOLUME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Returned for exclusion volumes.</string> - </map> - <key>OPT_LEGACY_LINKSET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Returned for movable obstacles, movable phantoms, physical, and volumedetect objects.</string> - </map> - <key>OPT_MATERIAL_VOLUME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Returned for material volumes.</string> - </map> - <key>OPT_OTHER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string>Returned for attachments, Linden trees, and grass.</string> - </map> - <key>OPT_STATIC_OBSTACLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Returned for static obstacles.</string> - </map> - <key>OPT_WALKABLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Returned for walkable objects.</string> - </map> - <key>PARCEL_COUNT_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_COUNT_OTHER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_COUNT_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_COUNT_SELECTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_COUNT_TEMP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_COUNT_TOTAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_DETAILS_AREA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>The parcel's area, in square meters. (5 chars.).</string> - </map> - <key>PARCEL_DETAILS_DESC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>The description of the parcel. (127 chars).</string> - </map> - <key>PARCEL_DETAILS_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>The parcel group's key. (36 chars.).</string> - </map> - <key>PARCEL_DETAILS_ID</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>The parcel's key. (36 chars.).</string> - </map> - <key>PARCEL_DETAILS_NAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>The name of the parcel. (63 chars.).</string> - </map> - <key>PARCEL_DETAILS_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>The parcel owner's key. (36 chars.).</string> - </map> - <key>PARCEL_DETAILS_SEE_AVATARS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>The parcel's avatar visibility setting. (1 char.).</string> - </map> - <key>PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x08000000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4000000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_CREATE_OBJECTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_DAMAGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_FLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10000000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_GROUP_SCRIPTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2000000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_LANDMARK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_SCRIPTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_ALLOW_TERRAFORM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_LOCAL_SOUND_ONLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_RESTRICT_PUSHOBJECT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200000</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_USE_ACCESS_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_USE_ACCESS_LIST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_USE_BAN_LIST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_FLAG_USE_LAND_PASS_LIST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x800</string> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_AGENT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_AUTO_ALIGN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_DESC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>Use this to get or set the parcel media description.</string> - </map> - <key>PARCEL_MEDIA_COMMAND_LOOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_LOOP_SET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>Used to get or set the parcel's media looping variable.</string> - </map> - <key>PARCEL_MEDIA_COMMAND_PAUSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_PLAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_SIZE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string>Use this to get or set the parcel media pixel resolution.</string> - </map> - <key>PARCEL_MEDIA_COMMAND_STOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_TEXTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_TIME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>Use this to get or set the parcel media MIME type (e.g. "text/html").</string> - </map> - <key>PARCEL_MEDIA_COMMAND_UNLOAD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>PARCEL_MEDIA_COMMAND_URL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PASS_ALWAYS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>1</string> - <key>tooltip</key> - <string>Always pass the event.</string> - </map> - <key>PASS_NEVER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>2</string> - <key>tooltip</key> - <string>Always pass the event.</string> - </map> - <key>PASS_IF_NOT_HANDLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0</string> - <key>tooltip</key> - <string>Pass the event if there is no script handling the event in the prim.</string> - </map> - <key>PASSIVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>Static in-world objects.</string> - </map> - <key>PATROL_PAUSE_AT_WAYPOINTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PAY_DEFAULT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PAY_HIDE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PAYMENT_INFO_ON_FILE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PAYMENT_INFO_USED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PERM_ALL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x7FFFFFFF</string> - <key>tooltip</key> - <string/> - </map> - <key>PERM_COPY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8000</string> - <key>tooltip</key> - <string/> - </map> - <key>PERM_MODIFY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4000</string> - <key>tooltip</key> - <string/> - </map> - <key>PERM_MOVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80000</string> - <key>tooltip</key> - <string/> - </map> - <key>PERM_TRANSFER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2000</string> - <key>tooltip</key> - <string/> - </map> - <key>PERMISSION_ATTACH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>If this permission is enabled, the object can successfully call llAttachToAvatar to attach to the given avatar.</string> - </map> - <key>PERMISSION_CHANGE_JOINTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string>(not yet implemented)</string> - </map> - <key>PERMISSION_CHANGE_LINKS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string>If this permission is enabled, the object can successfully call llCreateLink, llBreakLink, and llBreakAllLinks to change links to other objects.</string> - </map> - <key>PERMISSION_CHANGE_PERMISSIONS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string>(not yet implemented)</string> - </map> - <key>PERMISSION_CONTROL_CAMERA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x800</string> - <key>tooltip</key> - <string/> - </map> - <key>PERMISSION_DEBIT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>If this permission is enabled, the object can successfully call llGiveMoney or llTransferLindenDollars to debit the owners account.</string> - </map> - <key>PERMISSION_OVERRIDE_ANIMATIONS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8000</string> - <key>tooltip</key> - <string>Permission to override default animations.</string> - </map> - <key>PERMISSION_RELEASE_OWNERSHIP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>(not yet implemented)</string> - </map> - <key>PERMISSION_REMAP_CONTROLS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>(not yet implemented)</string> - </map> - <key>PERMISSION_RETURN_OBJECTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>65536</integer> - <key>tooltip</key> - <string/> - </map> - <key>PERMISSION_SILENT_ESTATE_MANAGEMENT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4000</string> - <key>tooltip</key> - <string>A script with this permission does not notify the object owner when it modifies estate access rules via llManageEstateAccess.</string> - </map> - <key>PERMISSION_TAKE_CONTROLS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>If this permission enabled, the object can successfully call the llTakeControls libray call.</string> - </map> - <key>PERMISSION_TELEPORT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1000</string> - <key>tooltip</key> - <string/> - </map> - <key>PERMISSION_TRACK_CAMERA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string/> - </map> - <key>PERMISSION_TRIGGER_ANIMATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>If this permission is enabled, the object can successfully call llStartAnimation for the avatar that owns this.</string> - </map> - <key>PI</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>3.14159265</real> - <key>tooltip</key> - <string>3.14159265 - The number of radians in a semi-circle.</string> - </map> - <key>PI_BY_TWO</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>1.57079633</real> - <key>tooltip</key> - <string>1.57079633 - The number of radians in a quarter circle.</string> - </map> - <key>PING_PONG</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Play animation going forwards, then backwards.</string> - </map> - <key>PRIM_ALPHA_MODE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>38</integer> - <key>tooltip</key> - <string>Prim parameter for materials using integer face, integer alpha_mode, integer alpha_cutoff.\nDefines how the alpha channel of the diffuse texture should be rendered.\nValid options for alpha_mode are PRIM_ALPHA_MODE_BLEND, _NONE, _MASK, and _EMISSIVE.\nalpha_cutoff is used only for PRIM_ALPHA_MODE_MASK.</string> - </map> - <key>PRIM_ALPHA_MODE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be ignored.</string> - </map> - <key>PRIM_ALPHA_MODE_BLEND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as alpha-blended.</string> - </map> - <key>PRIM_ALPHA_MODE_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as fully opaque for alpha values above alpha_cutoff and fully transparent otherwise.</string> - </map> - <key>PRIM_ALPHA_MODE_EMISSIVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as an emissivity mask.</string> - </map> - <key>PRIM_BUMP_BARK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_BLOBS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_BRICKS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_BRIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_CHECKER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_CONCRETE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_DARK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_DISKS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_GRAVEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_LARGETILE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_SHINY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>19</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_SIDING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_STONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_STUCCO</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_SUCTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_TILE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_WEAVE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_BUMP_WOOD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_CAST_SHADOWS</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>24</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>18</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_DESC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>28</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_FLEXIBLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_FULLBRIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_GLOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>25</integer> - <key>tooltip</key> - <string>PRIM_GLOW is used to get or set the glow status of the face.</string> - </map> - <key>PRIM_HOLE_CIRCLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_HOLE_DEFAULT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x00</string> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_HOLE_SQUARE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_HOLE_TRIANGLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x30</string> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_LINK_TARGET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>34</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_FLESH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_GLASS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_LIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_METAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_PLASTIC</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_RUBBER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_STONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MATERIAL_WOOD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_ALT_IMAGE_ENABLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets the default image state (the image that the user sees before a piece of media is active) for the chosen face. The default image is specified by Second Life's server for that media type.</string> - </map> - <key>PRIM_MEDIA_AUTO_LOOP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether auto-looping is enabled.</string> - </map> - <key>PRIM_MEDIA_AUTO_PLAY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether the media auto-plays when a Resident can view it.</string> - </map> - <key>PRIM_MEDIA_AUTO_SCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether auto-scaling is enabled. Auto-scaling forces the media to the full size of the texture.</string> - </map> - <key>PRIM_MEDIA_AUTO_ZOOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether clicking the media triggers auto-zoom and auto-focus on the media.</string> - </map> - <key>PRIM_MEDIA_CONTROLS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Integer. Gets/Sets the style of controls. Can be either PRIM_MEDIA_CONTROLS_STANDARD or PRIM_MEDIA_CONTROLS_MINI.</string> - </map> - <key>PRIM_MEDIA_CONTROLS_MINI</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Mini web navigation controls; does not include an address bar.</string> - </map> - <key>PRIM_MEDIA_CONTROLS_STANDARD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Standard web navigation controls.</string> - </map> - <key>PRIM_MEDIA_CURRENT_URL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>String. Gets/Sets the current url displayed on the chosen face. Changing this URL causes navigation. 1024 characters Maximum.</string> - </map> - <key>PRIM_MEDIA_FIRST_CLICK_INTERACT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether the first click interaction is enabled.</string> - </map> - <key>PRIM_MEDIA_HEIGHT_PIXELS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>Integer. Gets/Sets the height of the media in pixels.</string> - </map> - <key>PRIM_MEDIA_HOME_URL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>String. Gets/Sets the home URL for the chosen face. 1024 characters maximum.</string> - </map> - <key>PRIM_MEDIA_MAX_HEIGHT_PIXELS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2048</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_MAX_URL_LENGTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1024</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_MAX_WHITELIST_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>64</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_MAX_WHITELIST_SIZE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1024</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_MAX_WIDTH_PIXELS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2048</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PARAM_MAX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PERM_ANYONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PERM_GROUP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PERM_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PERM_OWNER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_MEDIA_PERMS_CONTROL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string>Integer. Gets/Sets the permissions mask that control who can see the media control bar above the object:: PRIM_MEDIA_PERM_ANYONE, PRIM_MEDIA_PERM_GROUP, PRIM_MEDIA_PERM_NONE, PRIM_MEDIA_PERM_OWNER</string> - </map> - <key>PRIM_MEDIA_PERMS_INTERACT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>Integer. Gets/Sets the permissions mask that control who can interact with the object: PRIM_MEDIA_PERM_ANYONE, PRIM_MEDIA_PERM_GROUP, PRIM_MEDIA_PERM_NONE, PRIM_MEDIA_PERM_OWNER</string> - </map> - <key>PRIM_MEDIA_WHITELIST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>String. Gets/Sets the white-list as a string of escaped, comma-separated URLs. This string can hold up to 64 URLs or 1024 characters, whichever comes first.</string> - </map> - <key>PRIM_MEDIA_WHITELIST_ENABLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string>Boolean. Gets/Sets whether navigation is restricted to URLs in PRIM_MEDIA_WHITELIST.</string> - </map> - <key>PRIM_MEDIA_WIDTH_PIXELS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string>Integer. Gets/Sets the width of the media in pixels.</string> - </map> - <key>PRIM_NAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>27</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_NORMAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>37</integer> - <key>tooltip</key> - <string>Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians</string> - </map> - <key>PRIM_OMEGA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>32</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_PHANTOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_PHYSICS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_PHYSICS_SHAPE_CONVEX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Use the convex hull of the prim shape for physics (this is the default for mesh objects).</string> - </map> - <key>PRIM_PHYSICS_SHAPE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Ignore this prim in the physics shape. NB: This cannot be applied to the root prim.</string> - </map> - <key>PRIM_PHYSICS_SHAPE_PRIM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Use the normal prim shape for physics (this is the default for all non-mesh objects).</string> - </map> - <key>PRIM_PHYSICS_SHAPE_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>30</integer> - <key>tooltip</key> - <string>Allows you to set the physics shape type of a prim via lsl. Permitted values are: - PRIM_PHYSICS_SHAPE_NONE, PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_CONVEX</string> - </map> - <key>PRIM_POINT_LIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>23</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_POS_LOCAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>33</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_POSITION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_ROT_LOCAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>29</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_ROTATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SCULPT_FLAG_INVERT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>64</integer> - <key>tooltip</key> - <string>Render inside out (inverts the normals).</string> - </map> - <key>PRIM_SCULPT_FLAG_MIRROR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>128</integer> - <key>tooltip</key> - <string>Render an X axis mirror of the sculpty.</string> - </map> - <key>PRIM_SCULPT_TYPE_CYLINDER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SCULPT_TYPE_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SCULPT_TYPE_PLANE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SCULPT_TYPE_SPHERE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SCULPT_TYPE_TORUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SHINY_HIGH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SHINY_LOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SHINY_MEDIUM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SHINY_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SIZE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SLICE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>35</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_SPECULAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>36</integer> - <key>tooltip</key> - <string>Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment</string> - </map> - <key>PRIM_TEMP_ON_REZ</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TEXGEN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>22</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TEXGEN_DEFAULT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TEXGEN_PLANAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TEXT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>26</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TEXTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_BOX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_CYLINDER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_PRISM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_RING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_SCULPT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_SPHERE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_TORUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PRIM_TYPE_TUBE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PROFILE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Disables profiling</string> - </map> - <key>PROFILE_SCRIPT_MEMORY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Enables memory profiling</string> - </map> - <key>PSYS_PART_BF_DEST_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_ONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_ONE_MINUS_DEST_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_SOURCE_ALPHA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_SOURCE_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BF_ZERO</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BLEND_FUNC_DEST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>25</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BLEND_FUNC_SOURCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>24</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_BOUNCE_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>Particles bounce off of a plane at the objects Z height.</string> - </map> - <key>PSYS_PART_EMISSIVE_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string>The particle glows.</string> - </map> - <key>PSYS_PART_END_ALPHA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>A float which determines the ending alpha of the object.</string> - </map> - <key>PSYS_PART_END_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>A vector <r, g, b> which determines the ending color of the object.</string> - </map> - <key>PSYS_PART_END_GLOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>27</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_END_SCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>A vector <sx, sy, z>, which is the ending size of the particle billboard in meters (z is ignored).</string> - </map> - <key>PSYS_PART_FLAGS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Each particle that is emitted by the particle system is simulated based on the following flags. To use multiple flags, bitwise or (|) them together.</string> - </map> - <key>PSYS_PART_FOLLOW_SRC_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>The particle position is relative to the source objects position.</string> - </map> - <key>PSYS_PART_FOLLOW_VELOCITY_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>The particle orientation is rotated so the vertical axis faces towards the particle velocity.</string> - </map> - <key>PSYS_PART_INTERP_COLOR_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Interpolate both the color and alpha from the start value to the end value.</string> - </map> - <key>PSYS_PART_INTERP_SCALE_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>Interpolate the particle scale from the start value to the end value.</string> - </map> - <key>PSYS_PART_MAX_AGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>Age in seconds of a particle at which it dies.</string> - </map> - <key>PSYS_PART_RIBBON_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_START_ALPHA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>A float which determines the starting alpha of the object.</string> - </map> - <key>PSYS_PART_START_COLOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>A vector <r.r, g.g, b.b> which determines the starting color of the object.</string> - </map> - <key>PSYS_PART_START_GLOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>26</integer> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_START_SCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>A vector <sx, sy, z>, which is the starting size of the particle billboard in meters (z is ignored).</string> - </map> - <key>PSYS_PART_TARGET_LINEAR_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_PART_TARGET_POS_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>The particle heads towards the location of the target object as defined by PSYS_SRC_TARGET_KEY.</string> - </map> - <key>PSYS_PART_WIND_MASK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Particles have their velocity damped towards the wind velocity.</string> - </map> - <key>PSYS_SRC_ACCEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>A vector <x, y, z> which is the acceleration to apply on particles.</string> - </map> - <key>PSYS_SRC_ANGLE_BEGIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>22</integer> - <key>tooltip</key> - <string>Area in radians specifying where particles will NOT be created (for ANGLE patterns)</string> - </map> - <key>PSYS_SRC_ANGLE_END</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>23</integer> - <key>tooltip</key> - <string>Area in radians filled with particles (for ANGLE patterns) (if lower than PSYS_SRC_ANGLE_BEGIN, acts as PSYS_SRC_ANGLE_BEGIN itself, and PSYS_SRC_ANGLE_BEGIN acts as PSYS_SRC_ANGLE_END).</string> - </map> - <key>PSYS_SRC_BURST_PART_COUNT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string>How many particles to release in a burst.</string> - </map> - <key>PSYS_SRC_BURST_RADIUS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string>What distance from the center of the object to create the particles.</string> - </map> - <key>PSYS_SRC_BURST_RATE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>How often to release a particle burst (float seconds).</string> - </map> - <key>PSYS_SRC_BURST_SPEED_MAX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>18</integer> - <key>tooltip</key> - <string>Maximum speed that a particle should be moving.</string> - </map> - <key>PSYS_SRC_BURST_SPEED_MIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string>Minimum speed that a particle should be moving.</string> - </map> - <key>PSYS_SRC_INNERANGLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>Specifies the inner angle of the arc created by the PSYS_SRC_PATTERN_ANGLE or PSYS_SRC_PATTERN_ANGLE_CONE source pattern. - The area specified will NOT have particles in it.</string> - </map> - <key>PSYS_SRC_MAX_AGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>19</integer> - <key>tooltip</key> - <string>How long this particle system should last, 0.0 means forever.</string> - </map> - <key>PSYS_SRC_OMEGA</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>21</integer> - <key>tooltip</key> - <string>Sets the angular velocity to rotate the axis that SRC_PATTERN_ANGLE and SRC_PATTERN_ANGLE_CONE use.</string> - </map> - <key>PSYS_SRC_OUTERANGLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string>Specifies the outer angle of the arc created by the PSYS_SRC_PATTERN_ANGLE or PSYS_SRC_PATTERN_ANGLE_CONE source pattern. - The area between the outer and inner angle will be filled with particles.</string> - </map> - <key>PSYS_SRC_PATTERN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string>The pattern which is used to generate particles. - Use one of the following values: PSYS_SRC_PATTERN Values.</string> - </map> - <key>PSYS_SRC_PATTERN_ANGLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x04</string> - <key>tooltip</key> - <string>Shoot particles across a 2 dimensional area defined by the arc created from PSYS_SRC_OUTERANGLE. There will be an open area defined by PSYS_SRC_INNERANGLE within the larger arc.</string> - </map> - <key>PSYS_SRC_PATTERN_ANGLE_CONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x08</string> - <key>tooltip</key> - <string>Shoot particles out in a 3 dimensional cone with an outer arc of PSYS_SRC_OUTERANGLE and an inner open area defined by PSYS_SRC_INNERANGLE.</string> - </map> - <key>PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>PSYS_SRC_PATTERN_DROP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x01</string> - <key>tooltip</key> - <string>Drop particles at the source position.</string> - </map> - <key>PSYS_SRC_PATTERN_EXPLODE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x02</string> - <key>tooltip</key> - <string>Shoot particles out in all directions, using the burst parameters.</string> - </map> - <key>PSYS_SRC_TARGET_KEY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string>The key of a target object to move towards if PSYS_PART_TARGET_POS_MASK is enabled.</string> - </map> - <key>PSYS_SRC_TEXTURE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>An asset name for the texture to use for the particles.</string> - </map> - <key>PU_EVADE_HIDDEN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x07</string> - <key>tooltip</key> - <string>Triggered when an llEvade character thinks it has hidden from its pursuer.</string> - </map> - <key>PU_EVADE_SPOTTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x08</string> - <key>tooltip</key> - <string>Triggered when an llEvade character switches from hiding to running</string> - </map> - <key>PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string/> - </map> - <key>PU_FAILURE_INVALID_GOAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x03</string> - <key>tooltip</key> - <string>Goal is not on the navigation-mesh and cannot be reached.</string> - </map> - <key>PU_FAILURE_INVALID_START</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x02</string> - <key>tooltip</key> - <string>Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it.</string> - </map> - <key>PU_FAILURE_NO_NAVMESH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x09</string> - <key>tooltip</key> - <string>This is a fatal error reported to a character when there is no navmesh for the region. This usually indicates a server failure and users should file a bug report and include the time and region in which they received this message.</string> - </map> - <key>PU_FAILURE_NO_VALID_DESTINATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x06</string> - <key>tooltip</key> - <string>There is no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable.</string> - </map> - <key>PU_FAILURE_OTHER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1000000</integer> - <key>tooltip</key> - <string/> - </map> - <key>PU_FAILURE_PARCEL_UNREACHABLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string/> - </map> - <key>PU_FAILURE_TARGET_GONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x05</string> - <key>tooltip</key> - <string>Target (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region.</string> - </map> - <key>PU_FAILURE_UNREACHABLE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x04</string> - <key>tooltip</key> - <string>Goal is no longer reachable for some reason - e.g., an obstacle blocks the path.</string> - </map> - <key>PU_GOAL_REACHED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x01</string> - <key>tooltip</key> - <string>Character has reached the goal and will stop or choose a new goal (if wandering).</string> - </map> - <key>PU_SLOWDOWN_DISTANCE_REACHED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x00</string> - <key>tooltip</key> - <string>Character is near current goal.</string> - </map> - <key>PUBLIC_CHANNEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>PUBLIC_CHANNEL is an integer constant that, when passed to llSay, llWhisper, or llShout as a channel parameter, will print text to the publicly heard chat channel.</string> - </map> - <key>PURSUIT_FUZZ_FACTOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Selects a random destination near the offset.</string> - </map> - <key>PURSUIT_GOAL_TOLERANCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string/> - </map> - <key>PURSUIT_INTERCEPT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Define whether the character attempts to predict the target's location.</string> - </map> - <key>PURSUIT_OFFSET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Go to a position offset from the target.</string> - </map> - <key>RAD_TO_DEG</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>57.2957795</real> - <key>tooltip</key> - <string>57.2957795 - Number of degrees per radian. You can use this number to convert radians to degrees by multiplying the radians by this number.</string> - </map> - <key>RC_DATA_FLAGS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_DETECT_PHANTOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_GET_LINK_NUM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_GET_NORMAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_GET_ROOT_KEY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_MAX_HITS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_REJECT_AGENTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_REJECT_LAND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_REJECT_NONPHYSICAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_REJECT_PHYSICAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>RC_REJECT_TYPES</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>RCERR_CAST_TIME_EXCEEDED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-3</integer> - <key>tooltip</key> - <string/> - </map> - <key>RCERR_SIM_PERF_LOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-2</integer> - <key>tooltip</key> - <string/> - </map> - <key>RCERR_UNKNOWN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>-1</integer> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_ALLOW_DAMAGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_ALLOW_DIRECT_TELEPORT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_BLOCK_FLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_BLOCK_FLYOVER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8000000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_BLOCK_TERRAFORM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_DISABLE_COLLISIONS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_DISABLE_PHYSICS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_FIXED_SUN</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_RESTRICT_PUSHOBJECT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400000</string> - <key>tooltip</key> - <string/> - </map> - <key>REGION_FLAG_SANDBOX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>REMOTE_DATA_CHANNEL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>REMOTE_DATA_REPLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string/> - </map> - <key>REMOTE_DATA_REQUEST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>REQUIRE_LINE_OF_SIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Define whether the character needs a line-of-sight to give chase.</string> - </map> - <key>RESTITUTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Used with llSetPhysicsMaterial to enable the density value. Must be between 0.0 and 1.0</string> - </map> - <key>REVERSE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>Play animation in reverse direction.</string> - </map> - <key>ROTATE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>Animate texture rotation.</string> - </map> - <key>SCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>Animate the texture scale.</string> - </map> - <key>SCRIPTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Scripted in-world objects.</string> - </map> - <key>SIM_STAT_PCT_CHARS_STEPPED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Returns the % of pathfinding characters skipped each frame, averaged over the last minute.\nThe returned value corresponds to the "Characters Updated" stat in the viewer's Statistics Bar.</string> - </map> - <key>SMOOTH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>Slide in the X direction, instead of playing separate frames.</string> - </map> - <key>SQRT2</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>1.41421356</real> - <key>tooltip</key> - <string>1.41421356 - The square root of 2.</string> - </map> - <key>STATUS_BLOCK_GRAB</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>Controls whether the object can be grabbed.\nA grab is the default action when in third person, and is available as the hand tool in build mode. This is useful for physical objects that you don't want other people to be able to trivially disturb. The default is FALSE</string> - </map> - <key>STATUS_BLOCK_GRAB_OBJECT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x400</string> - <key>tooltip</key> - <string>Prevent click-and-drag movement on all prims in the object.</string> - </map> - <key>STATUS_BOUNDS_ERROR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1002</integer> - <key>tooltip</key> - <string>Argument(s) passed to function had a bounds error.</string> - </map> - <key>STATUS_CAST_SHADOWS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string/> - </map> - <key>STATUS_DIE_AT_EDGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string>Controls whether the object is returned to the owners inventory if it wanders off the edge of the world.\nIt is useful to set this status TRUE for things like bullets or rockets. The default is TRUE</string> - </map> - <key>STATUS_INTERNAL_ERROR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1999</integer> - <key>tooltip</key> - <string>An internal error occurred.</string> - </map> - <key>STATUS_MALFORMED_PARAMS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1000</integer> - <key>tooltip</key> - <string>Function was called with malformed parameters.</string> - </map> - <key>STATUS_NOT_FOUND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1003</integer> - <key>tooltip</key> - <string>Object or other item was not found.</string> - </map> - <key>STATUS_NOT_SUPPORTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1004</integer> - <key>tooltip</key> - <string>Feature not supported.</string> - </map> - <key>STATUS_OK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>Result of function call was a success.</string> - </map> - <key>STATUS_PHANTOM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>Controls/indicates whether the object collides or not.\nSetting the value to TRUE makes the object non-colliding with all objects. It is a good idea to use this for most objects that move or rotate, but are non-physical. It is also useful for simulating volumetric lighting. The default is FALSE.</string> - </map> - <key>STATUS_PHYSICS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Controls/indicates whether the object moves physically.\nThis controls the same flag that the UI check-box for Physical controls. The default is FALSE.</string> - </map> - <key>STATUS_RETURN_AT_EDGE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>STATUS_ROTATE_X</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string/> - </map> - <key>STATUS_ROTATE_Y</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string/> - </map> - <key>STATUS_ROTATE_Z</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Controls/indicates whether the object can physically rotate around - the specific axis or not. This flag has no meaning - for non-physical objects. Set the value to FALSE - if you want to disable rotation around that axis. The - default is TRUE for a physical object. - A useful example to think about when visualizing - the effect is a sit-and-spin device. They spin around the - Z axis (up) but not around the X or Y axis.</string> - </map> - <key>STATUS_SANDBOX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>Controls/indicates whether the object can cross region boundaries - and move more than 20 meters from its creation - point. The default if FALSE.</string> - </map> - <key>STATUS_TYPE_MISMATCH</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1001</integer> - <key>tooltip</key> - <string>Argument(s) passed to function had a type mismatch.</string> - </map> - <key>STATUS_WHITELIST_FAILED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2001</integer> - <key>tooltip</key> - <string>Whitelist Failed.</string> - </map> - <key>STRING_TRIM</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x03</string> - <key>tooltip</key> - <string/> - </map> - <key>STRING_TRIM_HEAD</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x01</string> - <key>tooltip</key> - <string/> - </map> - <key>STRING_TRIM_TAIL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x02</string> - <key>tooltip</key> - <string/> - </map> - <key>TEXTURE_BLANK</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>5748decc-f629-461c-9a36-a35a221fe21f</uuid> - <key>tooltip</key> - <string/> - </map> - <key>TEXTURE_DEFAULT</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>89556747-24cb-43ed-920b-47caed15465f</uuid> - <key>tooltip</key> - <string/> - </map> - <key>TEXTURE_MEDIA</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>8b5fec65-8d8d-9dc5-cda8-8fdf2716e361</uuid> - <key>tooltip</key> - <string/> - </map> - <key>TEXTURE_PLYWOOD</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>89556747-24cb-43ed-920b-47caed15465f</uuid> - <key>tooltip</key> - <string/> - </map> - <key>TEXTURE_TRANSPARENT</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <uuid>8dcd4a48-2d37-4909-9f78-f7a9eb4ef903</uuid> - <key>tooltip</key> - <string/> - </map> - <key>TOUCH_INVALID_FACE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0xFFFFFFFF</string> - <key>tooltip</key> - <string/> - </map> - <key>TOUCH_INVALID_TEXCOORD</key> - <map> - <key>type</key> - <string>vector</string> - <key>value</key> - <string><-1.0, -1.0, 0.0></string> - <key>tooltip</key> - <string/> - </map> - <key>TOUCH_INVALID_VECTOR</key> - <map> - <key>type</key> - <string>vector</string> - <key>value</key> - <string><0.0, 0.0, 0.0></string> - <key>tooltip</key> - <string/> - </map> - <key>TRAVERSAL_TYPE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>One of TRAVERSAL_TYPE_FAST, TRAVERSAL_TYPE_SLOW, and TRAVERSAL_TYPE_NONE.</string> - </map> - <key>TRAVERSAL_TYPE_FAST</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string/> - </map> - <key>TRAVERSAL_TYPE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string/> - </map> - <key>TRAVERSAL_TYPE_SLOW</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>TRUE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>An integer constant for boolean comparisons. Has the value '1'.</string> - </map> - <key>TWO_PI</key> - <map> - <key>type</key> - <string>float</string> - <key>value</key> - <real>6.28318530</real> - <key>tooltip</key> - <string>6.28318530 - The radians of a circle.</string> - </map> - <key>TYPE_FLOAT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>The list entry is a float.</string> - </map> - <key>TYPE_INTEGER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>The list entry is an integer.</string> - </map> - <key>TYPE_INVALID</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>The list entry is invalid.</string> - </map> - <key>TYPE_KEY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>The list entry is a key.</string> - </map> - <key>TYPE_ROTATION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>The list entry is a rotation.</string> - </map> - <key>TYPE_STRING</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>The list entry is a string.</string> - </map> - <key>TYPE_VECTOR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>The list entry is a vector.</string> - </map> - <key>URL_REQUEST_DENIED</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>URL_REQUEST_DENIED</string> - <key>tooltip</key> - <string/> - </map> - <key>URL_REQUEST_GRANTED</key> - <map> - <key>type</key> - <string>string</string> - <key>value</key> - <string>URL_REQUEST_GRANTED</string> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>32</integer> - <key>tooltip</key> - <string>A slider between minimum (0.0) and maximum (1.0) deflection of angular orientation. That is, its a simple scalar for modulating the strength of angular deflection such that the vehicles preferred axis of motion points toward its real velocity.</string> - </map> - <key>VEHICLE_ANGULAR_DEFLECTION_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>33</integer> - <key>tooltip</key> - <string>The time-scale for exponential success of linear deflection deflection. Its another way to specify the strength of the vehicles tendency to reorient itself so that its preferred axis of motion agrees with its true velocity.</string> - </map> - <key>VEHICLE_ANGULAR_FRICTION_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string>A vector of timescales for exponential decay of the vehicles angular velocity about its preferred axes of motion (at, left, up). - Range = [0.07, inf) seconds for each element of the vector.</string> - </map> - <key>VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>35</integer> - <key>tooltip</key> - <string>The timescale for exponential decay of the angular motors magnitude.</string> - </map> - <key>VEHICLE_ANGULAR_MOTOR_DIRECTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>19</integer> - <key>tooltip</key> - <string>The direction and magnitude (in preferred frame) of the vehicles angular motor.The vehicle will accelerate (or decelerate if necessary) to match its velocity to its motor.</string> - </map> - <key>VEHICLE_ANGULAR_MOTOR_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>34</integer> - <key>tooltip</key> - <string>The timescale for exponential approach to full angular motor velocity.</string> - </map> - <key>VEHICLE_BANKING_EFFICIENCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>38</integer> - <key>tooltip</key> - <string>A slider between anti (-1.0), none (0.0), and maxmum (1.0) banking strength.</string> - </map> - <key>VEHICLE_BANKING_MIX</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>39</integer> - <key>tooltip</key> - <string>A slider between static (0.0) and dynamic (1.0) banking. "Static" means the banking scales only with the angle of roll, whereas "dynamic" is a term that also scales with the vehicles linear speed.</string> - </map> - <key>VEHICLE_BANKING_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>40</integer> - <key>tooltip</key> - <string>The timescale for banking to exponentially approach its maximum effect. This is another way to scale the strength of the banking effect, however it affects the term that is proportional to the difference between what the banking behavior is trying to do, and what the vehicle is actually doing.</string> - </map> - <key>VEHICLE_BUOYANCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>27</integer> - <key>tooltip</key> - <string>A slider between minimum (0.0) and maximum anti-gravity (1.0).</string> - </map> - <key>VEHICLE_FLAG_CAMERA_DECOUPLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x200</string> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x10</string> - <key>tooltip</key> - <string>Hover at global height.</string> - </map> - <key>VEHICLE_FLAG_HOVER_TERRAIN_ONLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x8</string> - <key>tooltip</key> - <string>Ignore water height when hovering.</string> - </map> - <key>VEHICLE_FLAG_HOVER_UP_ONLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x20</string> - <key>tooltip</key> - <string>Hover does not push down. Use this flag for hovering vehicles that should be able to jump above their hover height.</string> - </map> - <key>VEHICLE_FLAG_HOVER_WATER_ONLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x4</string> - <key>tooltip</key> - <string>Ignore terrain height when hovering.</string> - </map> - <key>VEHICLE_FLAG_LIMIT_MOTOR_UP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x40</string> - <key>tooltip</key> - <string>Prevents ground vehicles from motoring into the sky.</string> - </map> - <key>VEHICLE_FLAG_LIMIT_ROLL_ONLY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x2</string> - <key>tooltip</key> - <string>For vehicles with vertical attractor that want to be able to climb/dive, for instance, aeroplanes that want to use the banking feature.</string> - </map> - <key>VEHICLE_FLAG_MOUSELOOK_BANK</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x100</string> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_FLAG_MOUSELOOK_STEER</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x80</string> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_FLAG_NO_DEFLECTION_UP</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>This flag prevents linear deflection parallel to world z-axis. This is useful for preventing ground vehicles with large linear deflection, like bumper cars, from climbing their linear deflection into the sky.</string> - </map> - <key>VEHICLE_FLAG_NO_FLY_UP</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>type</key> - <string>integer</string> - <key>value</key> - <string>0x1</string> - <key>tooltip</key> - <string>Old, changed to VEHICLE_FLAG_NO_DEFLECTION_UP</string> - </map> - <key>VEHICLE_HOVER_EFFICIENCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>25</integer> - <key>tooltip</key> - <string>A slider between minimum (0.0 = bouncy) and maximum (1.0 = fast as possible) damped motion of the hover behavior. </string> - </map> - <key>VEHICLE_HOVER_HEIGHT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>24</integer> - <key>tooltip</key> - <string>The height (above the terrain or water, or global) at which the vehicle will try to hover.</string> - </map> - <key>VEHICLE_HOVER_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>26</integer> - <key>tooltip</key> - <string>Period of time (in seconds) for the vehicle to achieve its hover height.</string> - </map> - <key>VEHICLE_LINEAR_DEFLECTION_EFFICIENCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>28</integer> - <key>tooltip</key> - <string>A slider between minimum (0.0) and maximum (1.0) deflection of linear velocity. That is, its a simple scalar for modulating the strength of linear deflection.</string> - </map> - <key>VEHICLE_LINEAR_DEFLECTION_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>29</integer> - <key>tooltip</key> - <string>The timescale for exponential success of linear deflection deflection. It is another way to specify how much time it takes for the vehicles linear velocity to be redirected to its preferred axis of motion.</string> - </map> - <key>VEHICLE_LINEAR_FRICTION_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string>A vector of timescales for exponential decay of the vehicles linear velocity along its preferred axes of motion (at, left, up). - Range = [0.07, inf) seconds for each element of the vector.</string> - </map> - <key>VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>31</integer> - <key>tooltip</key> - <string>The timescale for exponential decay of the linear motors magnitude.</string> - </map> - <key>VEHICLE_LINEAR_MOTOR_DIRECTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>18</integer> - <key>tooltip</key> - <string>The direction and magnitude (in preferred frame) of the vehicles linear motor. The vehicle will accelerate (or decelerate if necessary) to match its velocity to its motor. - Range of magnitude = [0, 30] meters/second.</string> - </map> - <key>VEHICLE_LINEAR_MOTOR_OFFSET</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>20</integer> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_LINEAR_MOTOR_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>30</integer> - <key>tooltip</key> - <string>The timescale for exponential approach to full linear motor velocity.</string> - </map> - <key>VEHICLE_REFERENCE_FRAME</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>44</integer> - <key>tooltip</key> - <string>A rotation of the vehicles preferred axes of motion and orientation (at, left, up) with respect to the vehicles local frame (x, y, z).</string> - </map> - <key>VEHICLE_TYPE_AIRPLANE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>Uses linear deflection for lift, no hover, and banking to turn.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_AIRPLANE</string> - </map> - <key>VEHICLE_TYPE_BALLOON</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>Hover, and friction, but no deflection.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_BALLOON</string> - </map> - <key>VEHICLE_TYPE_BOAT</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>Hovers over water with lots of friction and some anglar deflection.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_BOAT</string> - </map> - <key>VEHICLE_TYPE_CAR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>Another vehicle that bounces along the ground but needs the motors to be driven from external controls or timer events.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_CAR</string> - </map> - <key>VEHICLE_TYPE_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>VEHICLE_TYPE_SLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>Simple vehicle that bumps along the ground, and likes to move along its local x-axis.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_SLED</string> - </map> - <key>VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>36</integer> - <key>tooltip</key> - <string>A slider between minimum (0.0 = wobbly) and maximum (1.0 = firm as possible) stability of the vehicle to keep itself upright.</string> - </map> - <key>VEHICLE_VERTICAL_ATTRACTION_TIMESCALE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>37</integer> - <key>tooltip</key> - <string>The period of wobble, or timescale for exponential approach, of the vehicle to rotate such that its preferred "up" axis is oriented along the worlds "up" axis.</string> - </map> - <key>VERTICAL</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>WANDER_PAUSE_AT_WAYPOINTS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string/> - </map> - <key>XP_ERROR_EXPERIENCES_DISABLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>2</integer> - <key>tooltip</key> - <string>The region currently has experiences disabled.</string> - </map> - <key>XP_ERROR_EXPERIENCE_DISABLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>8</integer> - <key>tooltip</key> - <string>The experience owner has temporarily disabled the experience.</string> - </map> - <key>XP_ERROR_EXPERIENCE_SUSPENDED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>9</integer> - <key>tooltip</key> - <string>The experience has been suspended by Linden Customer Support.</string> - </map> - <key>XP_ERROR_INVALID_EXPERIENCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>7</integer> - <key>tooltip</key> - <string>The script is associated with an experience that no longer exists.</string> - </map> - <key>XP_ERROR_INVALID_PARAMETERS</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>3</integer> - <key>tooltip</key> - <string>One of the string arguments was too big to fit in the key-value store.</string> - </map> - <key>XP_ERROR_KEY_NOT_FOUND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>14</integer> - <key>tooltip</key> - <string>The requested key does not exist.</string> - </map> - <key>XP_ERROR_MATURITY_EXCEEDED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>16</integer> - <key>tooltip</key> - <string>The content rating of the experience exceeds that of the region.</string> - </map> - <key>XP_ERROR_NONE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>0</integer> - <key>tooltip</key> - <string>No error was detected.</string> - </map> - <key>XP_ERROR_NOT_FOUND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>6</integer> - <key>tooltip</key> - <string>The sim was unable to verify the validity of the experience. Retrying after a short wait is advised.</string> - </map> - <key>XP_ERROR_NOT_PERMITTED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>4</integer> - <key>tooltip</key> - <string>This experience is not allowed to run by the requested agent.</string> - </map> - <key>XP_ERROR_NOT_PERMITTED_LAND</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>17</integer> - <key>tooltip</key> - <string>This experience is not allowed to run on the current region.</string> - </map> - <key>XP_ERROR_NO_EXPERIENCE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>5</integer> - <key>tooltip</key> - <string>This script is not associated with an experience.</string> - </map> - <key>XP_ERROR_QUOTA_EXCEEDED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>11</integer> - <key>tooltip</key> - <string>An attempted write data to the key-value store failed due to the data quota being met.</string> - </map> - <key>XP_ERROR_RETRY_UPDATE</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>15</integer> - <key>tooltip</key> - <string>A checked update failed due to an out of date request.</string> - </map> - <key>XP_ERROR_STORAGE_EXCEPTION</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>13</integer> - <key>tooltip</key> - <string>Unable to communicate with the key-value store.</string> - </map> - <key>XP_ERROR_STORE_DISABLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>12</integer> - <key>tooltip</key> - <string>The key-value store is currently disabled on this region.</string> - </map> - <key>XP_ERROR_THROTTLED</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>1</integer> - <key>tooltip</key> - <string>The call failed due to too many recent calls.</string> - </map> - <key>XP_ERROR_UNKNOWN_ERROR</key> - <map> - <key>type</key> - <string>integer</string> - <key>value</key> - <integer>10</integer> - <key>tooltip</key> - <string>Other unknown error.</string> - </map> - <key>ZERO_ROTATION</key> - <map> - <key>type</key> - <string>rotation</string> - <key>value</key> - <string><0.0, 0.0, 0.0, 1.0></string> - <key>tooltip</key> - <string/> - </map> - <key>ZERO_VECTOR</key> - <map> - <key>type</key> - <string>vector</string> - <key>value</key> - <string><0.0, 0.0, 0.0></string> - <key>tooltip</key> - <string/> - </map> - <key>default</key> - <map> - <key>tooltip</key> - <string>All scripts must have a default state, which is the first state entered when the script starts.\nIf another state is defined before the default state, the compiler will report a syntax error.</string> - </map> - </map> - <key>events</key> - <map> - <key>at_rot_target</key> - <map> - <key>arguments</key> - <array> - <map> - <key>TargetNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>TargetRotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>CurrentRotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered when a script comes within a defined angle of a target rotation. The range and rotation, are set by a call to llRotTarget.</string> - </map> - <key>at_target</key> - <map> - <key>arguments</key> - <array> - <map> - <key>TargetNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>TargetPosition</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>CurrentPosition</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered when the scripted object comes within a defined range of the target position, defined by the llTarget function call.</string> - </map> - <key>attach</key> - <map> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered whenever an object is attached or detached from an avatar. If it is attached, the key of the avatar it is attached to is passed in, otherwise NULL_KEY is.</string> - </map> - <key>changed</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Changed</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered when various events change the object. The change argument will be a bit-field of CHANGED_* constants.</string> - </map> - <key>collision</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfCollisions</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised while another object, or avatar, is colliding with the object the script is attached to. - The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* functions.</string> - </map> - <key>collision_end</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfCollisions</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when another object, or avatar, stops colliding with the object the script is attached to. - The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* library functions.</string> - </map> - <key>collision_start</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfCollisions</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when another object, or avatar, starts colliding with the object the script is attached to. - The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* library functions.</string> - </map> - <key>control</key> - <map> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Levels</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Edges</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Once a script has the ability to grab control inputs from the avatar, this event will be used to pass the commands into the script. - The levels and edges are bit-fields of control constants.</string> - </map> - <key>dataserver</key> - <map> - <key>arguments</key> - <array> - <map> - <key>RequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Data</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered when the requested data is returned to the script. - Data may be requested by the llRequestAgentData, llRequestInventoryData, and llGetNotecardLine function calls, for example.</string> - </map> - <key>email</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Time</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Address</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Subject</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Body</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>NumberRemaining</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered when an email sent to this script arrives. - The number remaining tells how many more emails are known to be still pending.</string> - </map> - <key>experience_permissions</key> - <map> - <key>arguments</key> - <array> - <map> - <key>agent_id</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>ID of the agent approving permission for the Experience.</string> - </map> - </map> - </array> - </map> - <key>experience_permissions_denied</key> - <map> - <key>arguments</key> - <array> - <map> - <key>agent_id</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>ID of the agent denying permission for the Experience.</string> - </map> - </map> - <map> - <key>Reason</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>One of the XP_ERROR_... constants describing the reason why the Experience permissions were denied for the agent.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Describes why the Experience permissions were denied for the agent.</string> - </map> - <key>http_request</key> - <map> - <key>arguments</key> - <array> - <map> - <key>HTTPRequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>HTTPMethod</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Body</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered when task receives an HTTP request.</string> - </map> - <key>http_response</key> - <map> - <key>arguments</key> - <array> - <map> - <key>HTTPRequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Status</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Metadata</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Body</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event handler is invoked when an HTTP response is received for a pending llHTTPRequest request or if a pending request fails or times out.</string> - </map> - <key>land_collision</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when the object the script is attached to is colliding with the ground.</string> - </map> - <key>land_collision_end</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when the object the script is attached to stops colliding with the ground.</string> - </map> - <key>land_collision_start</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when the object the script is attached to begins to collide with the ground.</string> - </map> - <key>link_message</key> - <map> - <key>arguments</key> - <array> - <map> - <key>SendersLink</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered when object receives a link message via llMessageLinked function call.</string> - </map> - <key>listen</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Name</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised whenever a chat message matching the constraints set in the llListen command is received. The name and ID of the speaker, as well as the message, are passed in as parameters. - Channel 0 is the public chat channel that all avatars see as chat text. Channels 1 through 2,147,483,648 are private channels that are not sent to avatars but other scripts can listen on those channels.</string> - </map> - <key>money</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Payer</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Amount</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is triggered when a resident has given an amount of Linden dollars to the object.</string> - </map> - <key>moving_end</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Triggered whenever an object with this script stops moving.</string> - </map> - <key>moving_start</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Triggered whenever an object with this script starts moving.</string> - </map> - <key>no_sensor</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>This event is raised when sensors are active, via the llSensor function call, but are not sensing anything.</string> - </map> - <key>not_at_rot_target</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>When a target is set via the llRotTarget function call, but the script is outside the specified angle this event is raised.</string> - </map> - <key>not_at_target</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>When a target is set via the llTarget library call, but the script is outside the specified range this event is raised.</string> - </map> - <key>object_rez</key> - <map> - <key>arguments</key> - <array> - <map> - <key>RezzedObjectsID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered when an object rezzes another object from its inventory via the llRezObject, or similar, functions. The id is the globally unique key for the object rezzed.</string> - </map> - <key>on_rez</key> - <map> - <key>arguments</key> - <array> - <map> - <key>StartParameter</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered whenever an object is rezzed from inventory or by another object. The start parameter is passed in from the llRezObject call, or zero if from inventory.</string> - </map> - <key>path_update</key> - <map> - <key>arguments</key> - <array> - <map> - <key>Type</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Reserved</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is called to inform the script of changes within the object's path-finding status.</string> - </map> - <key>remote_data</key> - <map> - <key>arguments</key> - <array> - <map> - <key>EventType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ChannelID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>MessageID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Sender</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Data</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Data</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered by various XML-RPC calls with event_type specifying the type of data.</string> - </map> - <key>run_time_permissions</key> - <map> - <key>arguments</key> - <array> - <map> - <key>PermissionFlags</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Scripts need permission from either the owner or the avatar they wish to act on before they may perform certain functions, such as debiting money from their owners account, triggering an animation on an avatar, or capturing control inputs. The llRequestPermissions library function is used to request these permissions and the various permissions integer constants can be supplied. - The integer returned to this event handler contains the current set of permissions flags, so if permissions equal 0 then no permissions are set.</string> - </map> - <key>sensor</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberDetected</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised whenever objects matching the constraints of the llSensor command are detected. - The number of detected objects is passed to the script in the parameter. Information on those objects may be gathered via the llDetected* functions.</string> - </map> - <key>state_entry</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>The state_entry event occurs whenever a new state is entered, including at program start, and is always the first event handled.</string> - </map> - <key>state_exit</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>The state_exit event occurs whenever the state command is used to transition to another state. It is handled before the new states state_entry event.</string> - </map> - <key>timer</key> - <map> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>This event is raised at regular intervals set by the llSetTimerEvent library function.</string> - </map> - <key>touch</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfTouches</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised while a user is touching the object the script is attached to. - The number of touching objects is passed to the script in the parameter. - Information on those objects may be gathered via the llDetected* library functions.</string> - </map> - <key>touch_end</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfTouches</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when a user stops touching the object the script is attached to. The number of touches is passed to the script in the parameter. - Information on those objects may be gathered via the llDetected* library functions.</string> - </map> - <key>touch_start</key> - <map> - <key>arguments</key> - <array> - <map> - <key>NumberOfTouches</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This event is raised when a user first touches the object the script is attached to. The number of touches is passed to the script in the parameter. - Information on those objects may be gathered via the llDetected() library functions.</string> - </map> - <key>transaction_result</key> - <map> - <key>arguments</key> - <array> - <map> - <key>RequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Success</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Message</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Triggered by llTransferMoney() function.</string> - </map> - </map> - <key>functions</key> - <map> - <key>llAbs</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>An integer value.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the absolute (positive) version of Value.</string> - </map> - <key>llAcos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>A floating-point value.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the arc-cosine of Value, in radians.</string> - </map> - <key>llAddToLandBanList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Agent UUID to add to ban-list.</string> - </map> - </map> - <map> - <key>Hours</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Period, in hours, to ban the avatar for.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Add avatar ID to the parcel ban list for the specified number of Hours.\nA value of 0 for Hours will add the agent indefinitely.\nThe smallest value that Hours will accept is 0.01; anything smaller will be seen as 0.\nWhen values that small are used, it seems the function bans in approximately 30 second increments (Probably 36 second increments, as 0.01 of an hour is 36 seconds).\nResidents teleporting to a parcel where they are banned will be redirected to a neighbouring parcel.</string> - </map> - <key>llAddToLandPassList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Agent UUID to add to pass-list.</string> - </map> - </map> - <map> - <key>Hours</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Period, in hours, to allow the avatar for.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Add avatar ID to the land pass list, for a duration of Hours.</string> - </map> - <key>llAdjustSoundVolume</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>The volume to set.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Adjusts the volume (0.0 - 1.0) of the currently playing attached sound.\nThis function has no effect on sounds started with llTriggerSound.</string> - </map> - <key>llAgentInExperience</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>AgentID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string></string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Returns TRUE if the agent is in the Experience and the Experience can run in the current location. - </string> - </map> - <key>llAllowInventoryDrop</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Flag</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, If TRUE allows anyone to drop inventory on prim, FALSE revokes.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If Flag == TRUE, users without object modify permissions can still drop inventory items into the object.</string> - </map> - <key>llAngleBetween</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Rot1</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string>First rotation.</string> - </map> - </map> - <map> - <key>Rot2</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string>Second rotation.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the angle, in radians, between rotations Rot1 and Rot2.</string> - </map> - <key>llApplyImpulse</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Force</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Amount of impulse force to apply.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE, force is treated as a local directional vector instead of region directional vector.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Applies impulse to the object.\nIf Local == TRUE, apply the Force in local coordinates; otherwise, apply the Force in global coordinates.\nThis function only works on physical objects.</string> - </map> - <key>llApplyRotationalImpulse</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Force</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Amount of impulse force to apply.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE, uses local axis, if FALSE, uses region axis.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Applies rotational impulse to the object.\nIf Local == TRUE, apply the Force in local coordinates; otherwise, apply the Force in global coordinates.\nThis function only works on physical objects.</string> - </map> - <key>llAsin</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>A floating-point value.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the arc-sine, in radians, of Value.</string> - </map> - <key>llAtan2</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>y</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>A floating-point value.</string> - </map> - </map> - <map> - <key>x</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>A floating-point value.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the arc-tangent2 of y, x.</string> - </map> - <key>llAttachToAvatar</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AttachmentPoint</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Attach to avatar at point AttachmentPoint.\nRequires the PERMISSION_ATTACH runtime permission.</string> - </map> - <key>llAttachToAvatarTemp</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AttachPoint</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Valid attachment point or ATTACH_* constant.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Follows the same convention as llAttachToAvatar, with the exception that the object will not create new inventory for the user, and will disappear on detach or disconnect.</string> - </map> - <key>llAvatarOnLinkSitTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If an avatar is sitting on the link's sit target, return the avatar's key, NULL_KEY otherwise.\nReturns a key that is the UUID of the user seated on the specified link's prim.</string> - </map> - <key>llAvatarOnSitTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>If an avatar is seated on the sit target, returns the avatar's key, otherwise NULL_KEY.\nThis only will detect avatars sitting on sit targets defined with llSitTarget.</string> - </map> - <key>llAxes2Rot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>Forward</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Forward/Back part of rotation.</string> - </map> - </map> - <map> - <key>Left</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Left/Right part of rotation.</string> - </map> - </map> - <map> - <key>Up</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Up/Down part of rotation.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation represented by coordinate axes Forward, Left, and Up.</string> - </map> - <key>llAxisAngle2Rot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>Axis</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Axis.</string> - </map> - </map> - <map> - <key>Angle</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Angle in radians.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation that is a generated Angle about Axis.</string> - </map> - <key>llBase64ToInteger</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns an integer that is the Text, Base64 decoded as a big endian integer.\nReturns zero if Text is longer then 8 characters. If Text contains fewer then 6 characters, the return value is unpredictable.</string> - </map> - <key>llBase64ToString</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Converts a Base64 string to a conventional string.\nIf the conversion creates any unprintable characters, they are converted to question marks.</string> - </map> - <key>llBreakAllLinks</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>De-links all prims in the link set (requires permission PERMISSION_CHANGE_LINKS be set).</string> - </map> - <key>llBreakLink</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>De-links the prim with the given link number (requires permission PERMISSION_CHANGE_LINKS be set).</string> - </map> - <key>llCastRay</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Casts a ray into the physics world from 'start' to 'end' and returns data according to details in Options.\nReports collision data for intersections with objects.\nReturn value: [UUID_1, {link_number_1}, hit_position_1, {hit_normal_1}, UUID_2, {link_number_2}, hit_position_2, {hit_normal_2}, ... , status_code] where {} indicates optional data.</string> - </map> - <key>llCeil</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns smallest integer value >= Value.</string> - </map> - <key>llClearCameraParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Resets all camera parameters to default values and turns off scripted camera control.</string> - </map> - <key>llClearLinkMedia</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Link</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Clears (deletes) the media and all parameters from the given Face on the linked prim.\nReturns an integer that is a STATUS_* flag, which details the success/failure of the operation.</string> - </map> - <key>llClearPrimMedia</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Number of side to clear.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Clears (deletes) the media and all parameters from the given Face.\nReturns an integer that is a STATUS_* flag which details the success/failure of the operation.</string> - </map> - <key>llCloseRemoteDataChannel</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ChannelID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Closes the specified XML-RPC channel.</string> - </map> - <key>llCloud</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the cloud density at the object's position + Offset.</string> - </map> - <key>llCollisionFilter</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ObjectName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ObjectID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Accept</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>If TRUE, only accept collisions with ObjectName name AND ObjectID (either is optional), otherwise with objects not ObjectName AND ObjectID.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Specify an empty string or NULL_KEY for Accept, to not filter on the corresponding parameter.</string> - </map> - <key>llCollisionSound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ImpactSound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ImpactVolume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Suppress default collision sounds, replace default impact sounds with ImpactSound.\nThe ImpactSound must be in the object inventory.\nSupply an empty string to suppress collision sounds.</string> - </map> - <key>llCollisionSprite</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ImpactSprite</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Suppress default collision sprites, replace default impact sprite with ImpactSprite; found in the object inventory (empty string to just suppress).</string> - </map> - <key>llCos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Theta</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the cosine of Theta (Theta in radians).</string> - </map> - <key>llCreateCharacter</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Convert link-set to AI/Physics character.\nCreates a path-finding entity, known as a "character", from the object containing the script. Required to activate use of path-finding functions.\nOptions is a list of key/value pairs.</string> - </map> - <key>llCreateKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Key</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Starts an asychronous transaction to create a key-value pair. Will fail with XP_ERROR_STORAGE_EXCEPTION if the key already exists. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value passed to the function. - </string> - </map> - <key>llCreateLink</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetPrim</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Object UUID that is in the same region.</string> - </map> - </map> - <map> - <key>Parent</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>If FALSE, then TargetPrim becomes the root. If TRUE, then the script's object becomes the root.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Attempt to link the object the script is in, to target (requires permission PERMISSION_CHANGE_LINKS be set).\nRequires permission PERMISSION_CHANGE_LINKS be set.</string> - </map> - <key>llCSV2List</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Create a list from a string of comma separated values specified in Text.</string> - </map> - <key>llDataSizeKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string> - Starts an asychronous transaction the request the used and total amount of data allocated for the Experience. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the the amount in use and the third item will be the total available. - </string> - </map> - <key>llDeleteCharacter</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Convert link-set from AI/Physics character to Physics object.\nConvert the current link-set back to a standard object, removing all path-finding properties.</string> - </map> - <key>llDeleteKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Key</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Starts an asychronous transaction to delete a key-value pair. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. - </string> - </map> - <key>llDeleteSubList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Source</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes the slice from start to end and returns the remainder of the list.\nRemove a slice from the list and return the remainder, start and end are inclusive.\nUsing negative numbers for start and/or end causes the index to count backwards from the length of the list, so 0, -1 would delete the entire list.\nIf Start is larger than End the list deleted is the exclusion of the entries; so 6, 4 would delete the entire list except for the 5th. list entry.</string> - </map> - <key>llDeleteSubString</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Source</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes the indicated sub-string and returns the result.\nStart and End are inclusive.\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would delete the entire string.\nIf Start is larger than End, the sub-string is the exclusion of the entries; so 6, 4 would delete the entire string except for the 5th. character.</string> - </map> - <key>llDetachFromAvatar</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Remove the object containing the script from the avatar.</string> - </map> - <key>llDetectedGrab</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the grab offset of a user touching the object.\nReturns <0.0, 0.0, 0.0> if Number is not a valid object.</string> - </map> - <key>llDetectedGroup</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns TRUE if detected object or agent Number has the same user group active as this object.\nIt will return FALSE if the object or agent is in the group, but the group is not active.</string> - </map> - <key>llDetectedKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the key of detected object or avatar number.\nReturns NULL_KEY if Number is not a valid index.</string> - </map> - <key>llDetectedLinkNumber</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the link position of the triggered event for touches and collisions only.\n0 for a non-linked object, 1 for the root of a linked object, 2 for the first child, etc.</string> - </map> - <key>llDetectedName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the name of detected object or avatar number.\nReturns the name of detected object number.\nReturns empty string if Number is not a valid index.</string> - </map> - <key>llDetectedOwner</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the key of detected object's owner.\nReturns invalid key if Number is not a valid index.</string> - </map> - <key>llDetectedPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the position of detected object or avatar number.\nReturns <0.0, 0.0, 0.0> if Number is not a valid index.</string> - </map> - <key>llDetectedRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation of detected object or avatar number.\nReturns <0.0, 0.0, 0.0, 1.0> if Number is not a valid offset.</string> - </map> - <key>llDetectedTouchBinormal</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detection information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the surface bi-normal for a triggered touch event.\nReturns a vector that is the surface bi-normal (tangent to the surface) where the touch event was triggered.</string> - </map> - <key>llDetectedTouchFace</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detection information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the index of the face where the avatar clicked in a triggered touch event.</string> - </map> - <key>llDetectedTouchNormal</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detection information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the surface normal for a triggered touch event.\nReturns a vector that is the surface normal (perpendicular to the surface) where the touch event was triggered.</string> - </map> - <key>llDetectedTouchPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detected information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the position, in region coordinates, where the object was touched in a triggered touch event.\nUnless it is a HUD, in which case it returns the position relative to the attach point.</string> - </map> - <key>llDetectedTouchST</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detection information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a vector that is the surface coordinates where the prim was touched.\nThe X and Y vector positions contain the horizontal (S) and vertical (T) face coordinates respectively.\nEach component is in the interval [0.0, 1.0].\nTOUCH_INVALID_TEXCOORD is returned if the surface coordinates cannot be determined (e.g. when the viewer does not support this function).</string> - </map> - <key>llDetectedTouchUV</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of detection information</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a vector that is the texture coordinates for where the prim was touched.\nThe X and Y vector positions contain the U and V face coordinates respectively.\nTOUCH_INVALID_TEXCOORD is returned if the touch UV coordinates cannot be determined (e.g. when the viewer does not support this function).</string> - </map> - <key>llDetectedType</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of detected object.\nReturns 0 if number is not a valid index.\nNote that number is a bit-field, so comparisons need to be a bitwise checked. e.g.:\ninteger iType = llDetectedType(0);\n{\n // ...do stuff with the agent\n}</string> - </map> - <key>llDetectedVel</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the velocity of the detected object Number.\nReturns<0.0, 0.0, 0.0> if Number is not a valid offset.</string> - </map> - <key>llDialog</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Buttons</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Shows a dialog box on the avatar's screen with the message.\n - Up to 12 strings in the list form buttons.\n - If a button is clicked, the name is chatted on Channel.\nOpens a "notify box" in the given avatars screen displaying the message.\n - Up to twelve buttons can be specified in a list of strings. When the user clicks a button, the name of the button is said on the specified channel.\n - Channels work just like llSay(), so channel 0 can be heard by everyone.\n - The chat originates at the object's position, not the avatar's position, even though it is said as the avatar (uses avatar's UUID and Name etc.).\n - Examples:\n - llDialog(who, "Are you a boy or a girl?", [ "Boy", "Girl" ], -4913);\n - llDialog(who, "This shows only an OK button.", [], -192);\n - llDialog(who, "This chats so you can 'hear' it.", ["Hooray"], 0);</string> - </map> - <key>llDie</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Delete the object which holds the script.</string> - </map> - <key>llDumpList2String</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Source</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Separator</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the list as a single string, using Separator between the entries.\nWrite the list out as a single string, using Separator between values.</string> - </map> - <key>llEdgeOfWorld</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Direction</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Checks to see whether the border hit by Direction from Position is the edge of the world (has no neighboring region).\nReturns TRUE if the line along Direction from Position hits the edge of the world in the current simulator, returns FALSE if that edge crosses into another simulator.</string> - </map> - <key>llEjectFromLand</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Ejects AvatarID from land that you own.\nEjects AvatarID from land that the object owner (group or resident) owns.</string> - </map> - <key>llEmail</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>20.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Address</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Subject</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sends email to Address with Subject and Message.\nSends an email to Address with Subject and Message.</string> - </map> - <key>llEscapeURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns an escaped/encoded version of url, replacing spaces with %20 etc.\nReturns the string that is the URL-escaped version of URL (replacing spaces with %20, etc.).\n - This function returns the UTF-8 encoded escape codes for selected characters.</string> - </map> - <key>llEuler2Rot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>Vector</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation representation of the Euler angles.\nReturns the rotation represented by the Euler Angle.</string> - </map> - <key>llEvade</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Agent or object to evade.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>No options yet.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Evade a specified target.\nCharacters will (roughly) try to hide from their pursuers if there is a good hiding spot along their fleeing path. Hiding means no direct line of sight from the head of the character (centre of the top of its physics bounding box) to the head of its pursuer and no direct path between the two on the navigation-mesh.</string> - </map> - <key>llExecCharacterCmd</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Command</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Command to send.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Height for CHARACTER_CMD_JUMP.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Execute a character command.\nSend a command to the path system.\nCurrently only supports stopping the current path-finding operation or causing the character to jump.</string> - </map> - <key>llFabs</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the positive version of Value.\nReturns the absolute value of Value.</string> - </map> - <key>llFleeFrom</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Source</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Global coordinate from which to flee.</string> - </map> - </map> - <map> - <key>Distance</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Distance in meters to flee from the source.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>No options available at this time.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Flee from a point.\nDirects a character (llCreateCharacter) to keep away from a defined position in the region or adjacent regions.</string> - </map> - <key>llFloor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns largest integer value <= Value.</string> - </map> - <key>llForceMouselook</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Enable</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE when an avatar sits on the prim, the avatar will be forced into mouse-look mode.\nFALSE is the default setting and will undo a previously set TRUE or do nothing.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If Enable is TRUE any avatar that sits on this object is forced into mouse-look mode.\nAfter calling this function with Enable set to TRUE, any agent sitting down on the prim will be forced into mouse-look.\nJust like llSitTarget, this changes a permanent property of the prim (not the object) and needs to be reset by calling this function with Enable set to FALSE in order to disable it.</string> - </map> - <key>llFrand</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Magnitude</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a pseudo random number in the range [0, Magnitude] or [Magnitude, 0].\nReturns a pseudo-random number between [0, Magnitude].</string> - </map> - <key>llGenerateKey</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Generates a key (SHA-1 hash) using UUID generation to create a unique key.\nAs the UUID produced is versioned, it should never return a value of NULL_KEY.\nThe specific UUID version is an implementation detail that has changed in the past and may change again in the future. Do not depend upon the UUID that is returned to be version 5 SHA-1 hash.</string> - </map> - <key>llGetAccel</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the acceleration of the object relative to the region's axes.\nGets the acceleration of the object.</string> - </map> - <key>llGetAgentInfo</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns an integer bit-field containing the agent information about id.\n - Returns AGENT_FLYING, AGENT_ATTACHMENTS, AGENT_SCRIPTED, AGENT_SITTING, AGENT_ON_OBJECT, AGENT_MOUSELOOK, AGENT_AWAY, AGENT_BUSY, AGENT_TYPING, AGENT_CROUCHING, AGENT_ALWAYS_RUN, AGENT_WALKING and/or AGENT_IN_AIR.\nReturns information about the given agent ID as a bit-field of agent info constants.</string> - </map> - <key>llGetAgentLanguage</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the language code of the preferred interface language of the avatar.\nReturns a string that is the language code of the preferred interface language of the resident.</string> - </map> - <key>llGetAgentList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Scope</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>The scope (region, parcel, parcel same owner) to return agents for.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of options to apply. Current unused.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests a list of agents currently in the region, limited by the scope parameter.\nReturns a list [key UUID-0, key UUID-1, ..., key UUID-n] or [string error_msg] - returns avatar keys for all agents in the region limited to the area(s) specified by scope</string> - </map> - <key>llGetAgentSize</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>If the avatar is in the same region, returns the size of the bounding box of the requested avatar by id, otherwise returns ZERO_VECTOR.\nIf the agent is in the same region as the object, returns the size of the avatar.</string> - </map> - <key>llGetAlpha</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the alpha value of Face.\nReturns the 'alpha' of the given face. If face is ALL_SIDES the value returned is the mean average of all faces.</string> - </map> - <key>llGetAndResetTime</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the script time in seconds and then resets the script timer to zero.\nGets the time in seconds since starting and resets the time to zero.</string> - </map> - <key>llGetAnimation</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the name of the currently playing locomotion animation for the avatar id.\nReturns the currently playing animation for the specified avatar ID.</string> - </map> - <key>llGetAnimationList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list of keys of playing animations for an avatar.\nReturns a list of keys of all playing animations for the specified avatar ID.</string> - </map> - <key>llGetAnimationOverride</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>AnimationState</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string that is the name of the animation that is used for the specified animation state\nTo use this function the script must obtain either the PERMISSION_OVERRIDE_ANIMATIONS or PERMISSION_TRIGGER_ANIMATION permission (automatically granted to attached objects).</string> - </map> - <key>llGetAttached</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the object's attachment point, or 0 if not attached.</string> - </map> - <key>llGetAttachedList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Avatar to get attachments</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list of keys of all visible (not HUD) attachments on the avatar identified by the ID argument</string> - </map> - <key>llGetBoundingBox</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the bounding box around the object (including any linked prims) relative to its root prim, as a list in the format [ (vector) min_corner, (vector) max_corner ].</string> - </map> - <key>llGetCameraPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current camera position for the agent the task has permissions for.\nReturns the position of the camera, of the user that granted the script PERMISSION_TRACK_CAMERA. If no user has granted the permission, it returns ZERO_VECTOR.</string> - </map> - <key>llGetCameraRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current camera orientation for the agent the task has permissions for. If no user has granted the PERMISSION_TRACK_CAMERA permission, returns ZERO_ROTATION.</string> - </map> - <key>llGetCenterOfMass</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the prim's centre of mass (unless called from the root prim, where it returns the object's centre of mass).</string> - </map> - <key>llGetClosestNavPoint</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Point</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>A point in region-local space.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>No options at this time.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Get the closest navigable point to the point provided.\nThe function accepts a point in region-local space (like all the other path-finding methods) and returns either an empty list or a list containing a single vector which is the closest point on the navigation-mesh to the point provided.</string> - </map> - <key>llGetColor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the color on Face.\nReturns the color of Face as a vector of red, green, and blue values between 0 and 1. If face is ALL_SIDES the color returned is the mean average of each channel.</string> - </map> - <key>llGetCreator</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a key for the creator of the prim.\nReturns the key of the object's original creator. Similar to llGetOwner.</string> - </map> - <key>llGetDate</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current date in the UTC time zone in the format YYYY-MM-DD.\nReturns the current UTC date as YYYY-MM-DD.</string> - </map> - <key>llGetDisplayName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Avatar UUID that is in the same region, or is otherwise known to the region.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the display name of an avatar, if the avatar is connected to the current region, or if the name has been cached. Otherwise, returns an empty string. Use llRequestDisplayName if the avatar may be absent from the region.</string> - </map> - <key>llGetEnergy</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns how much energy is in the object as a percentage of maximum.</string> - </map> - <key>llGetEnv</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>DataRequest</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>The type of data to request. Any other string will cause an empty string to be returned.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string with the requested data about the region.</string> - </map> - <key>llGetExperienceDetails</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ExperienceID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>May be NULL_KEY to retrieve the details for the script's Experience</string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Returns a list with the following Experience properties: [Experience Name, Owner ID, Group ID, Experience ID, State, State Message]. State is an integer corresponding to one of the constants XP_ERROR_... and State Message is the string returned by llGetExperienceErrorMessage for that integer. - </string> - </map> - <key>llGetExperienceErrorMessage</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Error</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>An Experience error code to translate.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Returns a string describing the error code passed or the string corresponding with XP_ERROR_UNKNOWN_ERROR if the value is not a valid Experience error code. - </string> - </map> - <key>llGetForce</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the force (if the script is physical).\nReturns the current force if the script is physical.</string> - </map> - <key>llGetFreeMemory</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of free bytes of memory the script can use.\nReturns the available free space for the current script. This is inaccurate with LSO.</string> - </map> - <key>llGetFreeURLs</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of available URLs for the current script.\nReturns an integer that is the number of available URLs.</string> - </map> - <key>llGetGeometricCenter</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the vector that is the geometric center of the object relative to the root prim.</string> - </map> - <key>llGetGMTclock</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the time in seconds since midnight GMT.\nGets the time in seconds since midnight in GMT/UTC.</string> - </map> - <key>llGetHTTPHeader</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>HTTPRequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>A valid HTTP request key</string> - </map> - </map> - <map> - <key>Header</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Header value name</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the value for header for request_id.\nReturns a string that is the value of the Header for HTTPRequestID.</string> - </map> - <key>llGetInventoryCreator</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a key for the creator of the inventory item.\nThis function returns the UUID of the creator of item. If item is not found in inventory, the object says "No item named 'name'".</string> - </map> - <key>llGetInventoryKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the key that is the UUID of the inventory named.\nReturns the key of the inventory named.</string> - </map> - <key>llGetInventoryName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>InventoryType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Inventory item type</string> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index number of inventory item.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the name of the inventory item of a given type, specified by index number.\nUse the inventory constants INVENTORY_* to specify the type.</string> - </map> - <key>llGetInventoryNumber</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>InventoryType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Inventory item type</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the quantity of items of a given type (INVENTORY_* flag) in the prim's inventory.\nUse the inventory constants INVENTORY_* to specify the type.</string> - </map> - <key>llGetInventoryPermMask</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Inventory item name.</string> - </map> - </map> - <map> - <key>BitMask</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>MASK_BASE, MASK_OWNER, MASK_GROUP, MASK_EVERYONE or MASK_NEXT</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the requested permission mask for the inventory item.\nReturns the requested permission mask for the inventory item defined by InventoryItem. If item is not in the object's inventory, llGetInventoryPermMask returns FALSE and causes the object to say "No item named '<item>'", where "<item>" is item.</string> - </map> - <key>llGetInventoryType</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the type of the named inventory item.\nLike all inventory functions, llGetInventoryType is case-sensitive.</string> - </map> - <key>llGetKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the key of the prim the script is attached to.\nGet the key for the object which has this script.</string> - </map> - <key>llGetLandOwnerAt</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the key of the land owner, returns NULL_KEY if public.\nReturns the key of the land owner at Position, or NULL_KEY if public.</string> - </map> - <key>llGetLinkKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the key of the linked prim LinkNumber.\nReturns the key of LinkNumber in the link set.</string> - </map> - <key>llGetLinkMedia</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag</string> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>The prim's side number</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A list of PRIM_* property constants to return values of.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Get the media parameters for a particular face on linked prim, given the desired list of parameter names. Returns a list of values in the order requested. Returns an empty list if no media exists on the face.</string> - </map> - <key>llGetLinkName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the name of LinkNumber in a link set.\nReturns the name of LinkNumber the link set.</string> - </map> - <key>llGetLinkNumber</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the link number of the prim containing the script (0 means not linked, 1 the prim is the root, 2 the prim is the first child, etc.).\nReturns the link number of the prim containing the script. 0 means no link, 1 the root, 2 for first child, etc.</string> - </map> - <key>llGetLinkNumberOfSides</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the number of sides of the specified linked prim.\nReturns an integer that is the number of faces (or sides) of the prim link.</string> - </map> - <key>llGetLinkPrimitiveParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag.</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>PRIM_* flags.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the list of primitive attributes requested in the Parameters list for LinkNumber.\nPRIM_* flags can be broken into three categories, face flags, prim flags, and object flags.\n* Supplying a prim or object flag will return that flags attributes.\n* Face flags require the user to also supply a face index parameter.</string> - </map> - <key>llGetListEntryType</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the type of the index entry in the list (TYPE_INTEGER, TYPE_FLOAT, TYPE_STRING, TYPE_KEY, TYPE_VECTOR, TYPE_ROTATION, or TYPE_INVALID if index is off list).\nReturns the type of the variable at Index in ListVariable.</string> - </map> - <key>llGetListLength</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the number of elements in the list.\nReturns the number of elements in ListVariable.</string> - </map> - <key>llGetLocalPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the position relative to the root.\nReturns the local position of a child object relative to the root.</string> - </map> - <key>llGetLocalRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the rotation local to the root.\nReturns the local rotation of a child object relative to the root.</string> - </map> - <key>llGetMass</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the mass of object that the script is attached to.\nReturns the scripted object's mass. When called from a script in a link-set, the parent will return the sum of the link-set weights, while a child will return just its own mass. When called from a script inside an attachment, this function will return the mass of the avatar it's attached to, not its own.</string> - </map> - <key>llGetMassMKS</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Acts as llGetMass(), except that the units of the value returned are Kg.</string> - </map> - <key>llGetMaxScaleFactor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a float that is the largest scaling factor that can be used with llScaleByFactor to resize the object. This maximum is determined by the Linkability Rules and prim scale limits.</string> - </map> - <key>llGetMemoryLimit</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Get the maximum memory a script can use, in bytes.</string> - </map> - <key>llGetMinScaleFactor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a float that is the smallest scaling factor that can be used with llScaleByFactor to resize the object. This minimum is determined by the prim scale limits.</string> - </map> - <key>llGetNextEmail</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Address</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Subject</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Fetch the next queued email with that matches the given address and/or subject, via the email event.\nIf the parameters are blank, they are not used for filtering.</string> - </map> - <key>llGetNotecardLine</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>NotecardName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>LineNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns LineNumber from NotecardName via the dataserver event. The line index starts at zero.\nIf the requested line is passed the end of the note-card the dataserver event will return the constant EOF string.\nThe key returned by this function is a unique identifier which will be supplied to the dataserver event in the requested parameter.</string> - </map> - <key>llGetNumberOfNotecardLines</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>NotecardName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the number of lines contained within a notecard via the dataserver event.\nThe key returned by this function is a query ID for identifying the dataserver reply.</string> - </map> - <key>llGetNumberOfPrims</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of prims in a link set the script is attached to.\nReturns the number of prims in (and avatars seated on) the object the script is in.</string> - </map> - <key>llGetNumberOfSides</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of faces (or sides) of the prim.\nReturns the number of sides of the prim which has the script.</string> - </map> - <key>llGetObjectDesc</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the description of the prim the script is attached to.\nReturns the description of the scripted object/prim. You can set the description using llSetObjectDesc.</string> - </map> - <key>llGetObjectDetails</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Prim or avatar UUID that is in the same region.</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of OBJECT_* flags.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list of object details specified in the Parameters list for the object or avatar in the region with key ID.\nParameters are specified by the OBJECT_* constants.</string> - </map> - <key>llGetObjectMass</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the mass of the avatar or object in the region.\nGets the mass of the object or avatar corresponding to ID.</string> - </map> - <key>llGetObjectName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the name of the prim which the script is attached to.\nReturns the name of the prim (not object) which contains the script.</string> - </map> - <key>llGetObjectPermMask</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Category</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Category is one of MASK_BASE, MASK_OWNER, MASK_GROUP, MASK_EVERYONE, or MASK_NEXT</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the permission mask of the requested category for the object.</string> - </map> - <key>llGetObjectPrimCount</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ObjectID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the total number of prims for an object in the region.\nReturns the prim count for any object id in the same region.</string> - </map> - <key>llGetOmega</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the rotation velocity in radians per second.\nReturns a vector that is the rotation velocity of the object in radians per second.</string> - </map> - <key>llGetOwner</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the object owner's UUID.\nReturns the key for the owner of the object.</string> - </map> - <key>llGetOwnerKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>ObjectID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the owner of ObjectID.\nReturns the key for the owner of object ObjectID.</string> - </map> - <key>llGetParcelDetails</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Location within the region.</string> - </map> - </map> - <map> - <key>ParcelDetails</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of details requested for the specified parcel location.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list of parcel details specified in the ParcelDetails list for the parcel at Position.\nParameters is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS.\nReturns a list that is the parcel details specified in ParcelDetails (in the same order) for the parcel at Position.</string> - </map> - <key>llGetParcelFlags</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a mask of the parcel flags (PARCEL_FLAG_*) for the parcel that includes the point Position.\nReturns a bit-field specifying the parcel flags (PARCEL_FLAG_*) for the parcel at Position.</string> - </map> - <key>llGetParcelMaxPrims</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Region coordinates (z is ignored) of parcel.</string> - </map> - </map> - <map> - <key>SimWide</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean. If FALSE then the return is the maximum prims supported by the parcel. If TRUE then it is the combined number of prims on all parcels in the region owned by the specified parcel's owner.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the maximum number of prims allowed on the parcel at Position for a given scope.\nThe scope may be set to an individual parcel or the combined resources of all parcels with the same ownership in the region.</string> - </map> - <key>llGetParcelMusicURL</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Gets the streaming audio URL for the parcel object is on.\nThe object owner, avatar or group, must also be the land owner.</string> - </map> - <key>llGetParcelPrimCount</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Region coordinates of parcel to query.</string> - </map> - </map> - <map> - <key>Category</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>A PARCEL_COUNT_* flag.</string> - </map> - </map> - <map> - <key>SimWide</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean. If FALSE then the return is the maximum prims supported by the parcel. If TRUE then it is the combined number of prims on all parcels in the region owned by the specified parcel's owner.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the number of prims on the parcel at Position of the given category.\nCategories: PARCEL_COUNT_TOTAL, _OWNER, _GROUP, _OTHER, _SELECTED, _TEMP.\nReturns the number of prims used on the parcel at Position which are in Category.\nIf SimWide is TRUE, it returns the total number of objects for all parcels with matching ownership in the category specified.\nIf SimWide is FALSE, it returns the number of objects on this specific parcel in the category specified</string> - </map> - <key>llGetParcelPrimOwners</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>2.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list of up to 100 residents who own objects on the parcel at Position, with per-owner land impact totals.\nRequires owner-like permissions for the parcel, and for the script owner to be present in the region.\nThe list is formatted as [ key agentKey1, integer agentLI1, key agentKey2, integer agentLI2, ... ], sorted by agent key.\nThe integers are the combined land impacts of the objects owned by the corresponding agents.</string> - </map> - <key>llGetPermissions</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns an integer bitmask of the permissions that have been granted to the script. Individual permissions can be determined using a bit-wise "and" operation against the PERMISSION_* constants</string> - </map> - <key>llGetPermissionsKey</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the key of the avatar that last granted or declined permissions to the script.\nReturns NULL_KEY if permissions were never granted or declined.</string> - </map> - <key>llGetPhysicsMaterial</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>list</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a list of the form [float gravity_multiplier, float restitution, float friction, float density].</string> - </map> - <key>llGetPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the position of the task in region coordinates.\nReturns the vector position of the task in region coordinates.</string> - </map> - <key>llGetPrimitiveParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>PRIM_* flags and face parameters</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the primitive parameters specified in the parameters list.\nReturns primitive parameters specified in the Parameters list.</string> - </map> - <key>llGetPrimMediaParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>face number</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>One or more PRIM_MEDIA_* flags</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the media parameters for a particular face on an object, given the desired list of parameter names, in the order requested. Returns an empty list if no media exists on the face.</string> - </map> - <key>llGetRegionAgentCount</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of avatars in the region.\nReturns an integer that is the number of avatars in the region.</string> - </map> - <key>llGetRegionCorner</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a vector, in meters, that is the global location of the south-west corner of the region which the object is in.\nReturns the Region-Corner of the simulator containing the task. The region-corner is a vector (values in meters) representing distance from the first region.</string> - </map> - <key>llGetRegionFlags</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the region flags (REGION_FLAG_*) for the region the object is in.\nReturns a bit-field specifying the region flags (REGION_FLAG_*) for the region the object is in.</string> - </map> - <key>llGetRegionFPS</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the mean region frames per second.</string> - </map> - <key>llGetRegionName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current region name.</string> - </map> - <key>llGetRegionTimeDilation</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current time dilation as a float between 0.0 (full dilation) and 1.0 (no dilation).\nReturns the current time dilation as a float between 0.0 and 1.0.</string> - </map> - <key>llGetRootPosition</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the position (in region coordinates) of the root prim of the object which the script is attached to.\nThis is used to allow a child prim to determine where the root is.</string> - </map> - <key>llGetRootRotation</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the rotation (relative to the region) of the root prim of the object which the script is attached to.\nGets the global rotation of the root object of the object script is attached to.</string> - </map> - <key>llGetRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the rotation relative to the region's axes.\nReturns the rotation.</string> - </map> - <key>llGetScale</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the scale of the prim.\nReturns a vector that is the scale (dimensions) of the prim.</string> - </map> - <key>llGetScriptName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the name of the script that this function is used in.\nReturns the name of this script.</string> - </map> - <key>llGetScriptState</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ScriptName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns TRUE if the script named is running.\nReturns TRUE if ScriptName is running.</string> - </map> - <key>llGetSimStats</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>StatType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Statistic type. Currently only SIM_STAT_PCT_CHARS_STEPPED is supported.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a float that is the requested statistic.</string> - </map> - <key>llGetSimulatorHostname</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>10.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the host-name of the machine which the script is running on.\nFor example, "sim225.agni.lindenlab.com".</string> - </map> - <key>llGetSPMaxMemory</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the maximum used memory for the current script. Only valid after using PROFILE_SCRIPT_MEMORY. Non-mono scripts always use 16k.\nReturns the integer of the most bytes used while llScriptProfiler was last active.</string> - </map> - <key>llGetStartParameter</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns an integer that is the script rez parameter.\nIf the object was rezzed by an agent, this function returns 0.</string> - </map> - <key>llGetStaticPath</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Starting position.</string> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Ending position.</string> - </map> - </map> - <map> - <key>Radius</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Radius of the character that the path is for, between 0.125m and 5.0m.</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Currently only accepts the parameter CHARACTER_TYPE; the options are identical to those used for llCreateCharacter. The default value is CHARACTER_TYPE_NONE.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string/> - </map> - <key>llGetStatus</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>StatusFlag</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>A STATUS_* flag</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns boolean value of the specified status (e.g. STATUS_PHANTOM) of the object the script is attached to.</string> - </map> - <key>llGetSubString</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>String</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a sub-string from String, in a range specified by the Start and End indicies (inclusive).\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would capture the entire string.\nIf Start is greater than End, the sub string is the exclusion of the entries.</string> - </map> - <key>llGetSunDirection</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a normalized vector of the direction of the sun in the region.\nReturns the sun's direction on the simulator.</string> - </map> - <key>llGetTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string that is the texture on face (the inventory name if it is a texture in the prim's inventory, otherwise the key).\nReturns the texture of a face, if it is found in object inventory, its key otherwise.</string> - </map> - <key>llGetTextureOffset</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the texture offset of face in the x and y components of a vector.</string> - </map> - <key>llGetTextureRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the texture rotation of side.</string> - </map> - <key>llGetTextureScale</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the texture scale of side in the x and y components of a vector.\nReturns the texture scale of a side in the x and y components of a vector.</string> - </map> - <key>llGetTime</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the time in seconds since the last region reset, script reset, or call to either llResetTime or llGetAndResetTime.</string> - </map> - <key>llGetTimeOfDay</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the time in seconds since Second Life midnight or since region up-time, whichever is smaller.\nThe Second Life day cycle is 4 hours.</string> - </map> - <key>llGetTimestamp</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns a time-stamp (UTC time zone) in the format: YYYY-MM-DDThh:mm:ss.ff..fZ.</string> - </map> - <key>llGetTorque</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the torque (if the script is physical).\nReturns a vector that is the torque (if the script is physical).</string> - </map> - <key>llGetUnixTime</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock.</string> - </map> - <key>llGetUsedMemory</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the current used memory for the current script. Non-mono scripts always use 16K.\nReturns the integer of the number of bytes of memory currently in use by the script. Non-mono scripts always use 16K.</string> - </map> - <key>llGetUsername</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the username of an avatar, if the avatar is connected to the current region, or if the name has been cached. Otherwise, returns an empty string. Use llRequestUsername if the avatar may be absent from the region.</string> - </map> - <key>llGetVel</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the velocity of the object.\nReturns a vector that is the velocity of the object.</string> - </map> - <key>llGetWallclock</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the time in seconds since midnight California Pacific time (PST/PDT).\nReturns the time in seconds since simulator's time-zone midnight (Pacific Time).</string> - </map> - <key>llGiveInventory</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Give InventoryItem to destination represented by TargetID, as permitted by the permissions system.\nTargetID may be any agent or an object in the same region.</string> - </map> - <key>llGiveInventoryList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>3.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>FolderName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>InventoryItems</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Give InventoryItems to destination (represented by TargetID) as a new folder of items, as permitted by the permissions system.\nTargetID may be any agent or an object in the same region. If TargetID is an object, the items are passed directly to the object inventory (no folder is created).</string> - </map> - <key>llGiveMoney</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Amount</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Transfers Amount of L$ from script owner to AvatarID.\nThis call will silently fail if PERMISSION_DEBIT has not been granted.</string> - </map> - <key>llGodLikeRezObject</key> - <map> - <key>god-mode</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItemID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Rez directly off of a UUID if owner has god-bit set.</string> - </map> - <key>llGround</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the ground height at the object position + offset.\nReturns the ground height at the object's position + Offset.</string> - </map> - <key>llGroundContour</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the ground contour direction below the object position + Offset.\nReturns the ground contour at the object's position + Offset.</string> - </map> - <key>llGroundNormal</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the ground normal below the object position + offset.\nReturns the ground contour at the object's position + Offset.</string> - </map> - <key>llGroundRepel</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Height</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Distance above the ground.</string> - </map> - </map> - <map> - <key>Water</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE then hover above water too.</string> - </map> - </map> - <map> - <key>Tau</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Seconds to critically damp in.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Critically damps to height if within height * 0.5 of level (either above ground level or above the higher of land and water if water == TRUE).\nCritically damps to fHeight if within fHeight * 0.5 of ground or water level.\n - The height is above ground level if iWater is FALSE or above the higher of land and water if iWater is TRUE.\n - Do not use with vehicles. Only works in physics-enabled objects.</string> - </map> - <key>llGroundSlope</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the ground slope below the object position + Offset.\nReturns the ground slope at the object position + Offset.</string> - </map> - <key>llHTTPRequest</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>A valid HTTP/HTTPS URL.</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Configuration parameters, specified as HTTP_* flag-value pairs.</string> - </map> - </map> - <map> - <key>Body</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Contents of the request.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sends an HTTP request to the specified URL with the Body of the request and Parameters.\nReturns a key that is a handle identifying the HTTP request made.</string> - </map> - <key>llHTTPResponse</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>HTTPRequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>A valid HTTP request key.</string> - </map> - </map> - <map> - <key>Status</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>HTTP Status (200, 400, 404, etc.).</string> - </map> - </map> - <map> - <key>Body</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Contents of the response.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Responds to an incoming HTTP request which was triggerd by an http_request event within the script. HTTPRequestID specifies the request to respond to (this ID is supplied in the http_request event handler). Status and Body specify the status code and message to respond with.</string> - </map> - <key>llInsertString</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>TargetVariable</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>SourceVariable</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Inserts SourceVariable into TargetVariable at Position, and returns the result.\nInserts SourceVariable into TargetVariable at Position and returns the result. Note this does not alter TargetVariable.</string> - </map> - <key>llInstantMessage</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>2.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>IMs Text to the user identified.\nSend Text to the user as an instant message.</string> - </map> - <key>llIntegerToBase64</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string that is a Base64 big endian encode of Value.\nEncodes the Value as an 8-character Base64 string.</string> - </map> - <key>llJson2List</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>JSON</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Converts the top level of the JSON string to a list.</string> - </map> - <key>llJsonGetValue</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>JSON</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Specifiers</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Gets the value indicated by Specifiers from the JSON string.</string> - </map> - <key>llJsonSetValue</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>JSON</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Specifiers</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a new JSON string that is the JSON given with the Value indicated by Specifiers set to Value.</string> - </map> - <key>llJsonValueType</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>JSON</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Specifiers</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the type constant (JSON_*) for the value in JSON indicated by Specifiers.</string> - </map> - <key>llKey2Name</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Avatar or rezzed prim UUID.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the name of the prim or avatar specified by ID. The ID must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.\nFor avatars, the returned name is the legacy name</string> - </map> - <key>llKeyCountKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string> - Starts an asychronous transaction the request the number of keys in the data store. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will the the number of keys in the system. - </string> - </map> - <key>llKeysKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>First</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Index of the first key to return.</string> - </map> - </map> - <map> - <key>Count</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>The number of keys to return.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Starts an asychronous transaction the request a number of keys from the data store. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. The error XP_ERROR_KEY_NOT_FOUND is returned if First is greater than or equal to the number of keys in the data store. In the success case the subsequent items will be the keys requested. The number of keys returned may be less than requested if the return value is too large or if there is not enough keys remaining. The order keys are returned is not guaranteed but is stable between subsequent calls as long as no keys are added or removed. Because the keys are returned in a comma-delimited list it is not recommended to use commas in key names if this function is used. - </string> - </map> - <key>llLinkParticleSystem</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag</string> - </map> - </map> - <map> - <key>Rules</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Particle system rules list in the format [ rule1, data1, rule2, data2 . . . ruleN, dataN ]</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Creates a particle system in prim LinkNumber based on Rules. An empty list removes a particle system from object.\nList format is [ rule-1, data-1, rule-2, data-2 ... rule-n, data-n ].\nThis is identical to llParticleSystem except that it applies to a specified linked prim and not just the prim the script is in.</string> - </map> - <key>llLinkSitTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag of the prim.</string> - </map> - </map> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Position for the sit target, relative to the prim's position.</string> - </map> - </map> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string>Rotation (relative to the prim's rotation) for the avatar.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the sit location for the linked prim(s). If Offset == <0,0,0> clear it.\nSet the sit location for the linked prim(s). The sit location is relative to the prim's position and rotation.</string> - </map> - <key>llList2CSV</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Creates a string of comma separated values from the list.\nCreate a string of comma separated values from the specified list.</string> - </map> - <key>llList2Float</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the float at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a float, then zero is returned.</string> - </map> - <key>llList2Integer</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the integer at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to an integer, then zero is returned.</string> - </map> - <key>llList2Json</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>JsonType</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Type is JSON_ARRAY or JSON_OBJECT.</string> - </map> - </map> - <map> - <key>Values</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of values to convert.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Converts either a strided list of key:value pairs to a JSON_OBJECT, or a list of values to a JSON_ARRAY.</string> - </map> - <key>llList2Key</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the key at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a key, then null string is returned.</string> - </map> - <key>llList2List</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a subset of entries from ListVariable, in a range specified by the Start and End indicies (inclusive).\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would capture the entire string.\nIf Start is greater than End, the sub string is the exclusion of the entries.</string> - </map> - <key>llList2ListStrided</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Stride</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the strided slice of the list from Start to End.\nReturns a copy of the strided slice of the specified list from Start to End.</string> - </map> - <key>llList2Rot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the rotation at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to rotation, thenZERO_ROTATION is returned.</string> - </map> - <key>llList2String</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the string at Index in the list.\nReturns the value at Index in the specified list as a string. If Index describes a location not in the list then null string is returned.</string> - </map> - <key>llList2Vector</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Index</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Copies the vector at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a vector, then ZERO_VECTOR is returned.</string> - </map> - <key>llListen</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>SpeakersName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>SpeakersID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Creates a listen callback for Text on Channel from SpeakersName and SpeakersID (SpeakersName, SpeakersID, and/or Text can be empty) and returns an identifier that can be used to deactivate or remove the listen.\nNon-empty values for SpeakersName, SpeakersID, and Text will filter the results accordingly, while empty strings and NULL_KEY will not filter the results, for string and key parameters respectively.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string> - </map> - <key>llListenControl</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ChannelHandle</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Active</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Makes a listen event callback active or inactive. Pass in the value returned from llListen to the iChannelHandle parameter to specify which listener you are controlling.\nUse boolean values to specify Active</string> - </map> - <key>llListenRemove</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ChannelHandle</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes a listen event callback. Pass in the value returned from llListen to the iChannelHandle parameter to specify which listener to remove.</string> - </map> - <key>llListFindList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Find</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the index of the first instance of Find in ListVariable. Returns -1 if not found.\nReturns the position of the first instance of the Find list in the ListVariable. Returns -1 if not found.</string> - </map> - <key>llListInsertList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Target</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list that contains all the elements from Target but with the elements from ListVariable inserted at Position start.\nReturns a new list, created by inserting ListVariable into the Target list at Position. Note this does not alter the Target.</string> - </map> - <key>llListRandomize</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Stride</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a version of the input ListVariable which has been randomized by blocks of size Stride.\nIf the remainder from the length of the list, divided by the stride is non-zero, this function does not randomize the list.</string> - </map> - <key>llListReplaceList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Target</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>End</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a list that is Target with Start through End removed and ListVariable inserted at Start.\nReturns a list replacing the slice of the Target list from Start to End with the specified ListVariable. Start and End are inclusive, so 0, 1 would replace the first two entries and 0, 0 would replace only the first list entry.</string> - </map> - <key>llListSort</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List to sort.</string> - </map> - </map> - <map> - <key>Stride</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Stride length.</string> - </map> - </map> - <map> - <key>Ascending</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean. TRUE = result in ascending order, FALSE = result in descending order.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the specified list, sorted into blocks of stride in ascending order (if Ascending is TRUE, otherwise descending). Note that sort only works if the first entry of each block is the same datatype.</string> - </map> - <key>llListStatistics</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Operation</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>One of LIST_STAT_* values</string> - </map> - </map> - <map> - <key>ListVariable</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Variable to analyze.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Performs a statistical aggregate function, specified by a LIST_STAT_* constant, on ListVariables.\nThis function allows a script to perform a statistical operation as defined by operation on a list composed of integers and floats.</string> - </map> - <key>llLoadURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Shows dialog to avatar AvatarID offering to load web page at URL. If user clicks yes, launches their web browser.\nllLoadURL displays a dialogue box to the user, offering to load the specified web page using the default web browser.</string> - </map> - <key>llLog</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the natural logarithm of Value. Returns zero if Value <= 0.\nReturns the base e (natural) logarithm of the specified Value.</string> - </map> - <key>llLog10</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the base 10 logarithm of Value. Returns zero if Value <= 0.\nReturns the base 10 (common) logarithm of the specified Value.</string> - </map> - <key>llLookAt</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Target</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Strength</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Damping</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Cause object name to point its forward axis towards Target, at a force controlled by Strength and Damping.\nGood Strength values are around half the mass of the object and good Damping values are less than 1/10th of the Strength.\nAsymmetrical shapes require smaller Damping. A Strength of 0.0 cancels the look at.</string> - </map> - <key>llLoopSound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays specified Sound, looping indefinitely, at Volume (0.0 - 1.0).\nOnly one sound may be attached to an object at a time.\nA second call to llLoopSound with the same key will not restart the sound, but the new volume will be used. This allows control over the volume of already playing sounds.\nSetting the volume to 0 is not the same as calling llStopSound; a sound with 0 volume will continue to loop.\nTo restart the sound from the beginning, call llStopSound before calling llLoopSound again.</string> - </map> - <key>llLoopSoundMaster</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays attached Sound, looping at volume (0.0 - 1.0), and declares it a sync master.\nBehaviour is identical to llLoopSound, with the addition of marking the source as a "Sync Master", causing "Slave" sounds to sync to it. If there are multiple masters within a viewers interest area, the most audible one (a function of both distance and volume) will win out as the master.\nThe use of multiple masters within a small area is unlikely to produce the desired effect.</string> - </map> - <key>llLoopSoundSlave</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays attached sound looping at volume (0.0 - 1.0), synced to most audible sync master.\nBehaviour is identical to llLoopSound, unless there is a "Sync Master" present.\nIf a Sync Master is already playing the Slave sound will begin playing from the same point the master is in its loop synchronizing the loop points of both sounds.\nIf a Sync Master is started when the Slave is already playing, the Slave will skip to the correct position to sync with the Master.</string> - </map> - <key>llMakeExplosion</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Particles</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Scale</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Lifetime</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Make a round explosion of particles. Deprecated: Use llParticleSystem instead.\nMake a round explosion of particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string> - </map> - <key>llMakeFire</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Particles</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Scale</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Lifetime</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Make fire like particles. Deprecated: Use llParticleSystem instead.\nMake fire particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string> - </map> - <key>llMakeFountain</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Particles</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Scale</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Lifetime</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Bounce</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Bounce_Offset</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Make a fountain of particles. Deprecated: Use llParticleSystem instead.\nMake a fountain of particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string> - </map> - <key>llMakeSmoke</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Particles</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Scale</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Lifetime</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Make smoke like particles. Deprecated: Use llParticleSystem instead.\nMake smoky particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string> - </map> - <key>llManageEstateAccess</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Action</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>One of the ESTATE_ACCESS_ALLOWED_* actions.</string> - </map> - </map> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>UUID of the avatar or group to act upon.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Adds or removes agents from the estate's agent access or ban lists, or groups to the estate's group access list. Action is one of the ESTATE_ACCESS_ALLOWED_* operations to perform.\nReturns an integer representing a boolean, TRUE if the call was successful; FALSE if throttled, invalid action, invalid or null id or object owner is not allowed to manage the estate.\nThe object owner is notified of any changes, unless PERMISSION_SILENT_ESTATE_MANAGEMENT has been granted to the script.</string> - </map> - <key>llMapDestination</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>RegionName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Direction</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Opens world map for avatar who touched is is wearing the script, centred on RegionName with Position highlighted. Only works for scripts attached to avatar, or during touch events.\nDirection currently has no effect.</string> - </map> - <key>llMD5String</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Nonce</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string of 32 hex characters that is an RSA Data Security Inc., MD5 Message-Digest Algorithm of Text with Nonce used as the salt.\nReturns a 32-character hex string. (128-bit in binary.)</string> - </map> - <key>llMessageLinked</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Number</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sends Number, Text, and ID to members of the link set identified by LinkNumber.\nLinkNumber is either a linked number (available through llGetLinkNumber) or a LINK_* constant.</string> - </map> - <key>llMinEventDelay</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Delay</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the minimum time between events being handled.</string> - </map> - <key>llModifyLand</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Action</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>LAND_LEVEL, LAND_RAISE, LAND_LOWER, LAND_SMOOTH, LAND_NOISE or LAND_REVERT</string> - </map> - </map> - <map> - <key>Area</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>0, 1, 2 (2m x 2m, 4m x 4m, or 8m x 8m)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Modify land with action (LAND_LEVEL, LAND_RAISE, LAND_LOWER, LAND_SMOOTH, LAND_NOISE, LAND_REVERT) on size (0, 1, 2, corresponding to 2m x 2m, 4m x 4m, 8m x 8m).</string> - </map> - <key>llModPow</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Power</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Modulus</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a Value raised to the Power, mod Modulus. ((a**b)%c) b is capped at 0xFFFF (16 bits).\nReturns (Value ^ Power) % Modulus. (Value raised to the Power, Modulus). Value is capped at 0xFFFF (16 bits).</string> - </map> - <key>llMoveToTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Target</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Tau</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Critically damp to Target in Tau seconds (if the script is physical).\nCritically damp to position target in tau-seconds if the script is physical. Good tau-values are greater than 0.2. A tau of 0.0 stops the critical damping.</string> - </map> - <key>llNavigateTo</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Location</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Region coordinates for the character to navigate to.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of parameters to control the type of path-finding used. Currently only FORCE_DIRECT_PATH supported.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Navigate to destination.\nDirects an object to travel to a defined position in the region or adjacent regions.</string> - </map> - <key>llOffsetTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>OffsetS</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>OffsetT</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the texture S and T offsets for the chosen Face.\nIf Face is ALL_SIDES this function sets the texture offsets for all faces.</string> - </map> - <key>llOpenRemoteDataChannel</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Requests a channel to listen for XML-RPC calls. (Deprecated: XML-RPC should not be used. Use http-in instead.)\nWill trigger a remote_data event with type = REMOTE_DATA_CHANNEL and a channel ID (key) once it is available.\nThis channel ID must be referenced in the XML-RPC call to the script (from the internet) -- so the key must somehow get to the external XML-RPC client.</string> - </map> - <key>llOverMyLand</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns TRUE if id ID over land owned by the script owner, otherwise FALSE.\nReturns TRUE if key ID is over land owned by the object owner, FALSE otherwise.</string> - </map> - <key>llOwnerSay</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>says Text to owner only (if owner is in region).\nSays Text to the owner of the object running the script, if the owner has been within the object's simulator since logging into Second Life, regardless of where they may be in-world.</string> - </map> - <key>llParcelMediaCommandList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>2.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>CommandList</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A list of PARCEL_MEDIA_COMMAND_* flags and their parameters </string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Controls the playback of multimedia resources on a parcel or for an agent, via one or more PARCEL_MEDIA_COMMAND_* arguments specified in CommandList.</string> - </map> - <key>llParcelMediaQuery</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>2.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>QueryList</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Queries the media properties of the parcel containing the script, via one or more PARCEL_MEDIA_COMMAND_* arguments specified in CommandList.\nThis function will only work if the script is contained within an object owned by the land-owner (or if the land is owned by a group, only if the object has been deeded to the group).</string> - </map> - <key>llParseString2List</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Separators</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Spacers</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Converts Text into a list, discarding Separators, keeping Spacers (Separators and Spacers must be lists of strings, maximum of 8 each).\nSeparators and Spacers are lists of strings with a maximum of 8 entries each.</string> - </map> - <key>llParseStringKeepNulls</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>list</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Separators</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Spacers</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Breaks Text into a list, discarding separators, keeping spacers, keeping any null values generated. (separators and spacers must be lists of strings, maximum of 8 each).\nllParseStringKeepNulls works almost exactly like llParseString2List, except that if a null is found it will add a null-string instead of discarding it like llParseString2List does.</string> - </map> - <key>llParticleSystem</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Creates a particle system in the prim the script is attached to, based on Parameters. An empty list removes a particle system from object.\nList format is [ rule-1, data-1, rule-2, data-2 ... rule-n, data-n ].</string> - </map> - <key>llPassCollisions</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Pass</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE, collisions are passed from children on to parents.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Configures how collision events are passed to scripts in the linkset.\nIf Pass == TRUE, collisions involving collision-handling scripted child prims are also passed on to the root prim. If Pass == FALSE (default behavior), such collisions will only trigger events in the affected child prim.</string> - </map> - <key>llPassTouches</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Pass</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE, touches are passed from children on to parents.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Configures how touch events are passed to scripts in the linkset.\nIf Pass == TRUE, touches involving touch-handling scripted child prims are also passed on to the root prim. If Pass == FALSE (default behavior), such touches will only trigger events in the affected child prim.</string> - </map> - <key>llPatrolPoints</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Points</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A list of vectors for the character to travel through sequentially. The list must contain at least two entries.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>No options available at this time.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Patrol a list of points.\nSets the points for a character (llCreateCharacter) to patrol along.</string> - </map> - <key>llPlaySound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays Sound once, at Volume (0.0 - 1.0) and attached to the object.\nOnly one sound may be attached to an object at a time, and attaching a new sound or calling llStopSound will stop the previously attached sound.\nA second call to llPlaySound with the same sound will not restart the sound, but the new volume will be used, which allows control over the volume of already playing sounds.\nTo restart the sound from the beginning, call llStopSound before calling llPlaySound again.</string> - </map> - <key>llPlaySoundSlave</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays attached Sound once, at Volume (0.0 - 1.0), synced to next loop of most audible sync master.\nBehaviour is identical to llPlaySound, unless there is a "Sync Master" present. If a Sync Master is already playing, the Slave sound will not be played until the Master hits its loop point and returns to the beginning.\nllPlaySoundSlave will play the sound exactly once; if it is desired to have the sound play every time the Master loops, either use llLoopSoundSlave with extra silence padded on the end of the sound or ensure that llPlaySoundSlave is called at least once per loop of the Master.</string> - </map> - <key>llPow</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Exponent</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the Value raised to the power Exponent, or returns 0 and triggers Math Error for imaginary results.\nReturns the Value raised to the Exponent.</string> - </map> - <key>llPreloadSound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Causes nearby viewers to preload the Sound from the object's inventory.\nThis is intended to prevent delays in starting new sounds when called upon.</string> - </map> - <key>llPursue</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Agent or object to pursue.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Parameters for pursuit.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Chase after a target.\nCauses the character (llCharacter) to pursue the target defined by TargetID.</string> - </map> - <key>llPushObject</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ObjectID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Impulse</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>AngularImpulse</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Applies Impulse and AngularImpulse to ObjectID.\nApplies the supplied impulse and angular impulse to the object specified.</string> - </map> - <key>llReadKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Key</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Starts an asychronous transaction to retrieve the value associated with the key given. Will fail with XP_ERROR_KEY_NOT_FOUND if the key does not exist. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. - </string> - </map> - <key>llRefreshPrimURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>20.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Reloads the web page shown on the sides of the object.</string> - </map> - <key>llRegionSay</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Any integer value except zero.</string> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Message to be transmitted.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Broadcasts Text to entire region on Channel (except for channel 0).</string> - </map> - <key>llRegionSayTo</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>TargetID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Avatar or object to say to.</string> - </map> - </map> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Output channel, any integer value.</string> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Message to be transmitted.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Says Text, on Channel, to avatar or object indicated by TargetID (if within region).\nIf TargetID is an avatar and Channel is nonzero, Text can be heard by any attachment on the avatar.</string> - </map> - <key>llReleaseCamera</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Return camera to agent.\nDeprecated: Use llClearCameraParams instead.</string> - </map> - <key>llReleaseControls</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Stop taking inputs.\nStop taking inputs from the avatar.</string> - </map> - <key>llReleaseURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>URL to release.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Releases the specified URL, which was previously obtained using llRequestURL. Once released, the URL will no longer be usable.</string> - </map> - <key>llRemoteDataReply</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>3.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ChannelID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>MessageID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>sData</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>String data to send</string> - </map> - </map> - <map> - <key>iData</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Integer data to send</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Send an XML-RPC reply to MessageID on ChannelID with payload of string sData and integer iData. Deprecated: Use HTTP functions/events instead.\nThe size of sData is limited to 254 characters.</string> - </map> - <key>llRemoteDataSetRegion</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Deprecated: Use HTTP functions/events instead.\nIf an object using remote data channels changes regions, you must call this function to re-register the remote data channels.\nYou do not need to make this call if you don't change regions.</string> - </map> - <key>llRemoteLoadScriptPin</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>3.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ObjectID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Target prim to attempt copying into.</string> - </map> - </map> - <map> - <key>ScriptName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Name of the script in current inventory to copy.</string> - </map> - </map> - <map> - <key>PIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Integer set on target prim as a Personal Information Number code.</string> - </map> - </map> - <map> - <key>Running</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>If the script should be set running in the target prim.</string> - </map> - </map> - <map> - <key>StartParameter</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Integer. Parameter passed to the script if set to be running.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If the owner of the object containing this script can modify the object identified by the specified object key, and if the PIN matches the PIN previously set using llSetRemoteScriptAccessPin (on the target prim), then the script will be copied into target. Running is a boolean specifying whether the script should be enabled once copied into the target object.</string> - </map> - <key>llRemoveFromLandBanList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Remove avatar from the land ban list.\nRemove specified avatar from the land parcel ban list.</string> - </map> - <key>llRemoveFromLandPassList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Remove avatar from the land pass list.\nRemove specified avatar from the land parcel pass list.</string> - </map> - <key>llRemoveInventory</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Remove the named inventory item.\nRemove the named inventory item from the object inventory.</string> - </map> - <key>llRemoveVehicleFlags</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Vehiclelags</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes the enabled bits in 'flags'.\nSets the vehicle flags to FALSE. Valid parameters can be found in the vehicle flags constants section.</string> - </map> - <key>llRequestAgentData</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Data</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests data about AvatarID. When data is available the dataserver event will be raised.\nThis function requests data about an avatar. If and when the information is collected, the dataserver event is triggered with the key returned from this function passed in the requested parameter. See the agent data constants (DATA_*) for details about valid values of data and what each will return in the dataserver event.</string> - </map> - <key>llRequestDisplayName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Avatar UUID</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests the display name of the agent. When the display name is available the dataserver event will be raised.\nThe avatar identified does not need to be in the same region or online at the time of the request.\nReturns a key that is used to identify the dataserver event when it is raised.</string> - </map> - <key>llRequestExperiencePermissions</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AgentID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>unused</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Not used, should be ""</string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Ask the agent for permission to participate in an experience. This request is similar to llRequestPermissions with the following permissions: PERMISSION_TAKE_CONTROLS, PERMISSION_TRIGGER_ANIMATION, PERMISSION_ATTACH, PERMISSION_TRACK_CAMERA, PERMISSION_CONTROL_CAMERA and PERMISSION_TELEPORT. However, unlike llRequestPermissions the decision to allow or block the request is persistent and applies to all scripts using the experience grid wide. Subsequent calls to llRequestExperiencePermissions from scripts in the experience will receive the same response automatically with no user interaction. One of experience_permissions or experience_permissions_denied will be generated in response to this call. Outstanding permission requests will be lost if the script is derezzed, moved to another region or reset. - </string> - </map> - <key>llRequestInventoryData</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests data for the named InventoryItem.\nWhen data is available, the dataserver event will be raised with the key returned from this function in the requested parameter.\nThe only request currently implemented is to request data from landmarks, where the data returned is in the form "<float, float, float>" which can be cast to a vector. This position is in region local coordinates.</string> - </map> - <key>llRequestPermissions</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>PermissionMask</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Ask AvatarID to allow the script to perform certain actions, specified in the PermissionMask bitmask. PermissionMask should be one or more PERMISSION_* constants. Multiple permissions can be requested simultaneously by ORing the constants together. Many of the permissions requests can only go to object owner.\nThis call will not stop script execution. If the avatar grants the requested permissions, the run_time_permissions event will be called.</string> - </map> - <key>llRequestSecureURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Requests one HTTPS:// (SSL) URL for use by this object. The http_request event is triggered with results.\nReturns a key that is the handle used for identifying the request in the http_request event.</string> - </map> - <key>llRequestSimulatorData</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>RegionName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Data</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests the specified Data about RegionName. When the specified data is available, the dataserver event is raised.\nData should use one of the DATA_SIM_* constants.\nReturns a dataserver query ID and triggers the dataserver event when data is found.</string> - </map> - <key>llRequestURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Requests one HTTP:// URL for use by this script. The http_request event is triggered with the result of the request.\nReturns a key that is the handle used for identifying the result in the http_request event.</string> - </map> - <key>llRequestUsername</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests single-word user-name of an avatar. When data is available the dataserver event will be raised.\nRequests the user-name of the identified agent. When the user-name is available the dataserver event is raised.\nThe agent identified does not need to be in the same region or online at the time of the request.\nReturns a key that is used to identify the dataserver event when it is raised.</string> - </map> - <key>llResetAnimationOverride</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AnimationState</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Resets the animation of the specified animation state to the default value.\nIf animation state equals "ALL", then all animation states are reset.</string> - </map> - <key>llResetLandBanList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Removes all residents from the land ban list.</string> - </map> - <key>llResetLandPassList</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Removes all residents from the land access/pass list.</string> - </map> - <key>llResetOtherScript</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ScriptName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Resets the named script.</string> - </map> - <key>llResetScript</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Resets the script.</string> - </map> - <key>llResetTime</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Sets the time to zero.\nSets the internal timer to zero.</string> - </map> - <key>llReturnObjectsByID</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ObjectIDs</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>List of object UUIDs to be returned.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Return objects using their UUIDs.\nRequires the PERMISSION_RETURN_OBJECTS permission and that the script owner owns the parcel the returned objects are in, or is an estate manager or region owner.</string> - </map> - <key>llReturnObjectsByOwner</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Object owner's UUID.</string> - </map> - </map> - <map> - <key>Scope</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Return objects based upon their owner and a scope of parcel, parcel owner, or region.\nRequires the PERMISSION_RETURN_OBJECTS permission and that the script owner owns the parcel the returned objects are in, or is an estate manager or region owner.</string> - </map> - <key>llRezAtRoot</key> - <map> - <key>energy</key> - <real>200.0</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>StartParameter</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Instantiate owner's InventoryItem at Position with Velocity, Rotation and with StartParameter. The last selected root object's location will be set to Position.\nCreates object's inventory item at the given Position, with Velocity, Rotation, and StartParameter.</string> - </map> - <key>llRezObject</key> - <map> - <key>energy</key> - <real>200</real> - <key>sleep</key> - <real>0.1</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>StartParameter</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Instantiate owners InventoryItem at Position with Velocity, Rotation and with start StartParameter.\nCreates object's inventory item at Position with Velocity and Rotation supplied. The StartParameter value will be available to the newly created object in the on_rez event or through the llGetStartParameter function.\nThe Velocity parameter is ignored if the rezzed object is not physical.</string> - </map> - <key>llRot2Angle</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation angle represented by Rotation.\nReturns the angle represented by the Rotation.</string> - </map> - <key>llRot2Axis</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation axis represented by Rotation.\nReturns the axis represented by the Rotation.</string> - </map> - <key>llRot2Euler</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the Euler representation (roll, pitch, yaw) of Rotation.\nReturns the Euler Angle representation of the Rotation.</string> - </map> - <key>llRot2Fwd</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the forward vector defined by Rotation.\nReturns the forward axis represented by the Rotation.</string> - </map> - <key>llRot2Left</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the left vector defined by Rotation.\nReturns the left axis represented by the Rotation.</string> - </map> - <key>llRot2Up</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the up vector defined by Rotation.\nReturns the up axis represented by the Rotation.</string> - </map> - <key>llRotateTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Radians</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the texture rotation for the specified Face to angle Radians.\nIf Face is ALL_SIDES, rotates the texture of all sides.</string> - </map> - <key>llRotBetween</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>rotation</string> - <key>arguments</key> - <array> - <map> - <key>Vector1</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Vector2</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the rotation to rotate Vector1 to Vector2.\nReturns the rotation needed to rotate Vector1 to Vector2.</string> - </map> - <key>llRotLookAt</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Strength</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Damping</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Cause object to rotate to Rotation, with a force function defined by Strength and Damping parameters. Good strength values are around half the mass of the object and good damping values are less than 1/10th of the strength.\nAsymmetrical shapes require smaller damping.\nA strength of 0.0 cancels the look at.</string> - </map> - <key>llRotTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>LeeWay</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set rotations with error of LeeWay radians as a rotational target, and return an ID for the rotational target.\nThe returned number is a handle that can be used in at_rot_target and llRotTargetRemove.</string> - </map> - <key>llRotTargetRemove</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Handle</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes rotational target number.\nRemove rotational target indicated by the handle.</string> - </map> - <key>llRound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns Value rounded to the nearest integer.\nReturns the Value rounded to the nearest integer.</string> - </map> - <key>llSameGroup</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns TRUE if avatar ID is in the same region and has the same active group, otherwise FALSE.\nReturns TRUE if the object or agent identified is in the same simulator and has the same active group as this object. Otherwise, returns FALSE.</string> - </map> - <key>llSay</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Channel to use to say text on.</string> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Text to say.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Says Text on Channel.\nThis chat method has a range of 20m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string> - </map> - <key>llScaleByFactor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>ScalingFactor</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>The multiplier to be used with the prim sizes and their local positions.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Attempts to resize the entire object by ScalingFactor, maintaining the size-position ratios of the prims.\n\nResizing is subject to prim scale limits and linkability limits. This function can not resize the object if the linkset is physical, a pathfinding character, in a keyframed motion, or if resizing would cause the parcel to overflow.\nReturns a boolean (an integer) TRUE if it succeeds, FALSE if it fails.</string> - </map> - <key>llScaleTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Horizontal</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Vertical</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the diffuse texture Horizontal and Vertical repeats on Face of the prim the script is attached to.\nIf Face == ALL_SIDES, all sides are set in one call.\nNegative values for horizontal and vertical will flip the texture.</string> - </map> - <key>llScriptDanger</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns TRUE if Position is over public land, sandbox land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.\nReturns true if the position is over public land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.</string> - </map> - <key>llScriptProfiler</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>State</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>PROFILE_NONE or PROFILE_SCRIPT_MEMORY flags to control the state.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Enables or disables script profiling options. Currently only supports PROFILE_SCRIPT_MEMORY (Mono only) and PROFILE_NONE.\nMay significantly reduce script performance.</string> - </map> - <key>llSendRemoteData</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>3.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>ChannelID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Destination</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: use HTTP functions and events instead.\nSends an XML-RPC request to Destination through ChannelID with payload of ChannelID (in a string), integer Value and string Text.\nReturns a key that is the message_id for the resulting remote_data events.</string> - </map> - <key>llSensor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Name</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Object or avatar name.</string> - </map> - </map> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Object or avatar UUID.</string> - </map> - </map> - <map> - <key>Type</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Bit-field mask of AGENT, AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED</string> - </map> - </map> - <map> - <key>Range</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Distance to scan. 0.0 - 96.0m.</string> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Angle, in radians, from the local x-axis of the prim to scan.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Performs a single scan for Name and ID with Type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within Range meters and Arc radians of forward vector.\nSpecifying a blank Name, 0 Type, or NULL_KEY ID will prevent filtering results based on that parameter. A range of 0.0 does not perform a scan.\nResults are returned in the sensor and no_sensor events.</string> - </map> - <key>llSensorRemove</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>removes sensor.\nRemoves the sensor set by llSensorRepeat.</string> - </map> - <key>llSensorRepeat</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Name</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Object or avatar name.</string> - </map> - </map> - <map> - <key>ID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>Object or avatar UUID.</string> - </map> - </map> - <map> - <key>Type</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Bit-field mask of AGENT, AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED</string> - </map> - </map> - <map> - <key>Range</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Distance to scan. 0.0 - 96.0m.</string> - </map> - </map> - <map> - <key>Arc</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Angle, in radians, from the local x-axis of the prim to scan.</string> - </map> - </map> - <map> - <key>Rate</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Period, in seconds, between scans.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Initiates a periodic scan every Rate seconds, for Name and ID with Type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within Range meters and Arc radians of forward vector.\nSpecifying a blank Name, 0 Type, or NULL_KEY ID will prevent filtering results based on that parameter. A range of 0.0 does not perform a scan.\nResults are returned in the sensor and no_sensor events.</string> - </map> - <key>llSetAlpha</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Opacity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the alpha (opacity) of Face.\nSets the alpha (opacity) value for Face. If Face is ALL_SIDES, sets the alpha for all faces. The alpha value is interpreted as an opacity percentage (1.0 is fully opaque, and 0.2 is mostly transparent). This function will clamp alpha values less than 0.1 to 0.1 and greater than 1.0 to 1.</string> - </map> - <key>llSetAngularVelocity</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AngVel</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>The angular velocity to set the object to.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>If TRUE, the AngVel is treated as a local directional vector instead of a regional directional vector.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets an object's angular velocity to AngVel, in local coordinates if Local == TRUE (if the script is physical).\nHas no effect on non-physical objects.</string> - </map> - <key>llSetAnimationOverride</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AnimationState</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>AnimationName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the animation (in object inventory) that will play for the given animation state.\nTo use this function the script must obtain the PERMISSION_OVERRIDE_ANIMATIONS permission.</string> - </map> - <key>llSetBuoyancy</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Buoyancy</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the tasks buoyancy (0 is none, < 1.0 sinks, 1.0 floats, > 1.0 rises).\nSet the object buoyancy. A value of 0 is none, less than 1.0 sinks, 1.0 floats, and greater than 1.0 rises.</string> - </map> - <key>llSetCameraAtOffset</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the camera used in this object, at offset, if an avatar sits on it.\nSets the offset that an avatar's camera will be moved to if the avatar sits on the object.</string> - </map> - <key>llSetCameraEyeOffset</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the camera eye offset used in this object if an avatar sits on it.</string> - </map> - <key>llSetCameraParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets multiple camera parameters at once. List format is [ rule-1, data-1, rule-2, data-2 . . . rule-n, data-n ].</string> - </map> - <key>llSetClickAction</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Action</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>A CLICK_ACTION_* flag</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the action performed when a prim is clicked upon.</string> - </map> - <key>llSetColor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Color</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the color, for the face.\nSets the color of the side specified. If Face is ALL_SIDES, sets the color on all faces.</string> - </map> - <key>llSetContentType</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>HTTPRequestID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>A valid http_request() key</string> - </map> - </map> - <map> - <key>ContentType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Media type to use with any following llHTTPResponse(HTTPRequestID, ...)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the media type of an LSL HTTP server response to ContentType.\nHTTPRequestID must be a valid http_request ID. ContentType must be one of the CONTENT_TYPE_* constants.</string> - </map> - <key>llSetDamage</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Damage</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the amount of damage that will be done to an avatar that this task hits. Task will be killed.\nSets the amount of damage that will be done to an avatar that this object hits. This object will be destroyed on damaging an avatar, and no collision event is triggered.</string> - </map> - <key>llSetForce</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Force</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Directional force.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets Force on object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string> - </map> - <key>llSetForceAndTorque</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Force</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Directional force.</string> - </map> - </map> - <map> - <key>Torque</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Torque force.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the Force and Torque of object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string> - </map> - <key>llSetHoverHeight</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Height</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Distance above the ground.</string> - </map> - </map> - <map> - <key>Water</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE then hover above water too.</string> - </map> - </map> - <map> - <key>Tau</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Seconds to critically damp in.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Critically damps a physical object to a Height (either above ground level or above the higher of land and water if water == TRUE).\nDo not use with vehicles. Use llStopHover to stop hovering.</string> - </map> - <key>llSetInventoryPermMask</key> - <map> - <key>god-mode</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>InventoryItem</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>An item in the prim's inventory</string> - </map> - </map> - <map> - <key>PermissionFlag</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>MASK_* flag</string> - </map> - </map> - <map> - <key>PermissionMask</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Permission bit-field (PERM_* flags)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the given permission mask to the new value on the inventory item.</string> - </map> - <key>llSetKeyframedMotion</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Keyframes</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Strided keyframe list of the form: position, orientation, time. Each keyframe is interpreted relative to the previous transform of the object.</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests that a non-physical object be key-framed according to key-frame list.\nSpecify a list of times, positions, and orientations to be followed by an object. The object will be smoothly moved between key-frames by the simulator. Collisions with other non-physical or key-framed objects will be ignored (no script events will fire and collision processing will not occur). Collisions with physical objects will be computed and reported, but the key-framed object will be unaffected by those collisions.\nKeyframes is a strided list containing positional, rotational, and time data for each step in the motion. Options is a list containing optional arguments and parameters (specified by KFM_* constants).</string> - </map> - <key>llSetLinkAlpha</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Opacity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>If a prim exists in the link chain at LinkNumber, set Face to Opacity.\nSets the Face, on the linked prim specified, to the Opacity.</string> - </map> - <key>llSetLinkCamera</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Prim link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag</string> - </map> - </map> - <map> - <key>EyeOffset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Offset, relative to the object's centre and expressed in local coordinates, that the camera looks from.</string> - </map> - </map> - <map> - <key>LookOffset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Offset, relative to the object's centre and expressed in local coordinates, that the camera looks toward.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the camera eye offset, and the offset that camera is looking at, for avatars that sit on the linked prim.</string> - </map> - <key>llSetLinkColor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag.</string> - </map> - </map> - <map> - <key>Color</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Color in RGB <R.R, G.G, B.B></string> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Side number or ALL_SIDES.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If a task exists in the link chain at LinkNumber, set the Face to color.\nSets the color of the linked child's side, specified by LinkNumber.</string> - </map> - <key>llSetLinkMedia</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Link</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims).</string> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Face number.</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A set of name/value pairs (in no particular order)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the media parameters for a particular face on linked prim, specified by Link. Returns an integer that is a STATUS_* flag which details the success/failure of the operation(s).\nMediaParameters is a set of name/value pairs in no particular order. Parameters not specified are unchanged, or if new media is added then set to the default specified.</string> - </map> - <key>llSetLinkPrimitiveParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set primitive parameters for LinkNumber based on Parameters.\nSets the parameters (or properties) of any linked prim in one step.</string> - </map> - <key>llSetLinkPrimitiveParamsFast</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag</string> - </map> - </map> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set primitive parameters for LinkNumber based on Parameters, without a delay.\nSet parameters for link number, from the list of Parameters, with no built-in script sleep. This function is identical to llSetLinkPrimitiveParams, except without the delay.</string> - </map> - <key>llSetLinkTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the Texture of Face on a linked prim, specified by LinkNumber. Texture may be a UUID or name of a texture in prim inventory.</string> - </map> - <key>llSetLinkTextureAnim</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>LinkNumber</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Link number (0: unlinked, 1: root prim, >1: child prims) or a LINK_* flag to effect</string> - </map> - </map> - <map> - <key>Mode</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Bitmask of animation options.</string> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Specifies which object face to animate or ALL_SIDES.</string> - </map> - </map> - <map> - <key>SizeX</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Horizontal frames (ignored for ROTATE and SCALE).</string> - </map> - </map> - <map> - <key>SizeY</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Vertical frames (ignored for ROTATE and SCALE).</string> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Start position/frame number (or radians for ROTATE).</string> - </map> - </map> - <map> - <key>Length</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Specifies the animation duration, in frames (or radians for ROTATE).</string> - </map> - </map> - <map> - <key>Rate</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Specifies the animation playback rate, in frames per second (must be greater than zero).</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Animates a texture on the prim specified by LinkNumber, by setting the texture scale and offset.\nMode is a bitmask of animation options.\nFace specifies which object face to animate.\nSizeX and SizeY specify the number of horizontal and vertical frames.Start specifes the animation start point.\nLength specifies the animation duration.\nRate specifies the animation playback rate.</string> - </map> - <key>llSetLocalRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the rotation of a child prim relative to the root prim.</string> - </map> - <key>llSetMemoryLimit</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Limit</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>The amount to reserve, which must be less than the allowed maximum (currently 64KB) and not already have been exceeded.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests Limit bytes to be reserved for this script.\nReturns TRUE or FALSE indicating whether the limit was set successfully.\nThis function has no effect if the script is running in the LSO VM.</string> - </map> - <key>llSetObjectDesc</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Description</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the description of the prim to Description.\nThe description field is limited to 127 characters.</string> - </map> - <key>llSetObjectName</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Name</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the prim's name to Name.</string> - </map> - <key>llSetObjectPermMask</key> - <map> - <key>god-mode</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>PermissionFlag</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>MASK_* flag</string> - </map> - </map> - <map> - <key>PermissionMask</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Permission bit-field (PERM_* flags)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the specified PermissionFlag permission to the value specified by PermissionMask on the object the script is attached to.</string> - </map> - <key>llSetParcelMusicURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>2.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the streaming audio URL for the parcel the object is on.\nThe object must be owned by the owner of the parcel; if the parcel is group owned the object must be owned by that group.</string> - </map> - <key>llSetPayPrice</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Price</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>The default price shown in the textu input field.</string> - </map> - </map> - <map> - <key>QuickButtons</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Specifies the 4 payment values shown in the payment dialog's buttons (or PAY_HIDE).</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the default amount when someone chooses to pay this object.\nPrice is the default price shown in the textu input field. QuickButtons specifies the 4 payment values shown in the payment dialog's buttons.\nInput field and buttons may be hidden with PAY_HIDE constant, and may be set to their default values using PAY_DEFAULT.</string> - </map> - <key>llSetPhysicsMaterial</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real/> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>MaterialBits</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>A bitmask specifying which of the parameters in the other arguments should be applied to the object.</string> - </map> - </map> - <map> - <key>GravityMultiplier</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Restitution</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Friction</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Density</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the selected parameters of the object's physics behavior.\nMaterialBits is a bitmask specifying which of the parameters in the other arguments should be applied to the object. GravityMultiplier, Restitution, Friction, and Density are the possible parameters to manipulate.</string> - </map> - <key>llSetPos</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Region coordinates to move to (within 10m).</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If the object is not physical, this function sets the position of the prim.\nIf the script is in a child prim, Position is treated as root relative and the link-set is adjusted.\nIf the prim is the root prim, the entire object is moved (up to 10m) to Position in region coordinates.</string> - </map> - <key>llSetPrimitiveParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Parameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A list of changes.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>This function changes the many properties (or "parameters") of a prim in one operation. Parameters is a list of changes.</string> - </map> - <key>llSetPrimMediaParams</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Face number</string> - </map> - </map> - <map> - <key>MediaParameters</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>A set of name/value pairs (in no particular order)</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the MediaParameters for a particular Face on the prim. Returns an integer that is a STATUS_* flag which details the success/failure of the operation(s).\nMediaParameters is a set of name/value pairs in no particular order. Parameters not specified are unchanged, or if new media is added then set to the default specified.</string> - </map> - <key>llSetPrimURL</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>20.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Use llSetPrimMediaParams instead.</string> - </map> - <key>llSetRegionPos</key> - <map> - <key>energy</key> - <real>0.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Vector. The location to move to, in region coordinates.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Attempts to move the object so that the root prim is within 0.1m of Position.\nReturns an integer boolean, TRUE if the object is successfully placed within 0.1 m of Position, FALSE otherwise.\nPosition may be any location within the region or up to 10m across a region border.\nIf the position is below ground, it will be set to the ground level at that x,y location.</string> - </map> - <key>llSetRemoteScriptAccessPin</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>PIN</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>If PIN is set to a non-zero number, the task will accept remote script loads via llRemoteLoadScriptPin() if it passes in the correct PIN. Othersise, llRemoteLoadScriptPin() is ignored.</string> - </map> - <key>llSetRot</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>If the object is not physical, this function sets the rotation of the prim.\nIf the script is in a child prim, Rotation is treated as root relative and the link-set is adjusted.\nIf the prim is the root prim, the entire object is rotated to Rotation in the global reference frame.</string> - </map> - <key>llSetScale</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Scale</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the prim's scale (size) to Scale.</string> - </map> - <key>llSetScriptState</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ScriptName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Running</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Enable or disable the script Running state of Script in the prim.</string> - </map> - <key>llSetSitText</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Displays Text rather than 'Sit' in the viewer's context menu.</string> - </map> - <key>llSetSoundQueueing</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>QueueEnable</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, sound queuing: TRUE enables, FALSE disables (default).</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets whether successive calls to llPlaySound, llLoopSound, etc., (attached sounds) interrupt the currently playing sound.\nThe default for objects is FALSE. Setting this value to TRUE will make the sound wait until the current playing sound reaches its end. The queue is one level deep.</string> - </map> - <key>llSetSoundRadius</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Radius</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Maximum distance that sounds can be heard.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Limits radius for audibility of scripted sounds (both attached and triggered) to distance Radius.</string> - </map> - <key>llSetStatus</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Status</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets object status specified in Status bitmask (e.g. STATUS_PHYSICS|STATUS_PHANTOM) to boolean Value.\nFor a full list of STATUS_* constants, see wiki documentation.</string> - </map> - <key>llSetText</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Color</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Opacity</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Causes Text to float above the prim, using the specified Color and Opacity.</string> - </map> - <key>llSetTexture</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.2</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Texture</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Applies Texture to Face of prim.\nTexture may be a UUID or name of a texture in prim inventory.\nIf Face is ALL_SIDES, set the texture on all faces.</string> - </map> - <key>llSetTextureAnim</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Mode</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Mask of Mode flags.</string> - </map> - </map> - <map> - <key>Face</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Face number or ALL_SIDES.</string> - </map> - </map> - <map> - <key>SizeX</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Horizontal frames (ignored for ROTATE and SCALE).</string> - </map> - </map> - <map> - <key>SizeY</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Vertical frames (ignored for ROTATE and SCALE).</string> - </map> - </map> - <map> - <key>Start</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Start position/frame number (or radians for ROTATE).</string> - </map> - </map> - <map> - <key>Length</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>number of frames to display (or radians for ROTATE).</string> - </map> - </map> - <map> - <key>Rate</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string>Frames per second (must not greater than zero).</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Animates a texture by setting the texture scale and offset.\nMode is a bitmask of animation options.\nFace specifies which object face to animate.\nSizeX and SizeY specify the number of horizontal and vertical frames.Start specifes the animation start point.\nLength specifies the animation duration.\nRate specifies the animation playback rate.</string> - </map> - <key>llSetTimerEvent</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Rate</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Causes the timer event to be triggered every Rate seconds.\n Passing in 0.0 stops further timer events.</string> - </map> - <key>llSetTorque</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Torque</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Torque force.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets the Torque acting on the script's object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string> - </map> - <key>llSetTouchText</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Displays Text in the viewer context menu that acts on a touch.</string> - </map> - <key>llSetVehicleFlags</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Flags</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Enables the vehicle flags specified in the Flags bitmask.\nValid parameters can be found in the wiki documentation.</string> - </map> - <key>llSetVehicleFloatParam</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ParameterName</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ParameterValue</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets a vehicle float parameter.\nValid parameters can be found in the wiki documentation.</string> - </map> - <key>llSetVehicleRotationParam</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ParameterName</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ParameterValue</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets a vehicle rotation parameter.\nValid parameters can be found in the wiki documentation.</string> - </map> - <key>llSetVehicleType</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Type</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Activates the vehicle action on the object with vehicle preset Type.\nValid Types and an explanation of their characteristics can be found in wiki documentation.</string> - </map> - <key>llSetVehicleVectorParam</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>ParameterName</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>ParameterValue</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Sets a vehicle vector parameter.\nValid parameters can be found in the wiki documentation.</string> - </map> - <key>llSetVelocity</key> - <map> - <key>energy</key> - <real/> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Velocity</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>The velocity to apply.</string> - </map> - </map> - <map> - <key>Local</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>If TRUE, the Velocity is treated as a local directional vector instead of a regional directional vector.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If the object is physics-enabled, sets the object's linear velocity to Velocity.\nIf Local==TRUE, Velocity is treated as a local directional vector; otherwise, Velocity is treated as a global directional vector.</string> - </map> - <key>llSHA1String</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string of 40 hex characters that is the SHA1 security Hash of Text.</string> - </map> - <key>llShout</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Shouts Text on Channel.\nThis chat method has a range of 100m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string> - </map> - <key>llSin</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Theta</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the sine of Theta (Theta in radians).</string> - </map> - <key>llSitTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Rotation</key> - <map> - <key>type</key> - <string>rotation</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Set the sit location for this object. If offset == ZERO_VECTOR, clears the sit target.</string> - </map> - <key>llSleep</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Time</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Put script to sleep for Time seconds.</string> - </map> - <key>llSound</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Queue</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Loop</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Use llPlaySound instead.\nPlays Sound at Volume and specifies whether the sound should loop and/or be enqueued.</string> - </map> - <key>llSoundPreload</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Use llPreloadSound instead.\nPreloads a sound on viewers within range.</string> - </map> - <key>llSqrt</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the square root of Value.\nTriggers a math runtime error for imaginary results (if Value < 0.0).</string> - </map> - <key>llStartAnimation</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Animation</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This function plays the specified animation from playing on the avatar who received the script's most recent permissions request.\nAnimation may be an animation in task inventory or a built-in animation.\nRequires PERMISSION_TRIGGER_ANIMATION.</string> - </map> - <key>llStopAnimation</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Animation</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This function stops the specified animation on the avatar who received the script's most recent permissions request.\nAnimation may be an animation in task inventory, a built-in animation, or the uuid of an animation.\nRequires PERMISSION_TRIGGER_ANIMATION.</string> - </map> - <key>llStopHover</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Stop hovering to a height (due to llSetHoverHeight()).</string> - </map> - <key>llStopLookAt</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Stop causing object to point at a target (due to llLookAt() or llRotLookAt()).</string> - </map> - <key>llStopMoveToTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Stops critically damped motion (due to llMoveToTarget()).</string> - </map> - <key>llStopSound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Stops playback of the currently attached sound.</string> - </map> - <key>llStringLength</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns an integer that is the number of characters in Text (not counting the null).</string> - </map> - <key>llStringToBase64</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the string Base64 representation of the input string.</string> - </map> - <key>llStringTrim</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>String to trim</string> - </map> - </map> - <map> - <key>TrimType</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>STRING_TRIM_HEAD, STRING_TRIM_TAIL, or STRING_TRIM.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Outputs a string, eliminating white-space from the start and/or end of the input string Text.\nValid options for TrimType:\nSTRING_TRIM_HEAD: trim all leading spaces in Text\nSTRING_TRIM_TAIL: trim all trailing spaces in Text\nSTRING_TRIM: trim all leading and trailing spaces in Text.</string> - </map> - <key>llSubStringIndex</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Sequence</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns an integer that is the index in Text where string pattern Sequence first appears. Returns -1 if not found.</string> - </map> - <key>llTakeCamera</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Use llSetCameraParams instead.</string> - </map> - <key>llTakeControls</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Controls</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Bit-field of CONTROL_* flags.</string> - </map> - </map> - <map> - <key>Accept</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, determines whether control events are generated.</string> - </map> - </map> - <map> - <key>PassOn</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>Boolean, determines whether controls are disabled.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Take controls from the agent the script has permissions for.\nIf (Accept == (Controls & input)), send input to the script. PassOn determines whether Controls also perform their normal functions.\nRequires the PERMISSION_TAKE_CONTROLS permission to run.</string> - </map> - <key>llTan</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Theta</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the tangent of Theta (Theta in radians).</string> - </map> - <key>llTarget</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>integer</string> - <key>arguments</key> - <array> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Range</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>This function is to have the script know when it has reached a position.\nIt registers a Position with a Range that triggers at_target and not_at_target events continuously until unregistered.</string> - </map> - <key>llTargetOmega</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Axis</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>SpinRate</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Gain</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Attempt to spin at SpinRate with strength Gain on Axis.\nA spin rate of 0.0 cancels the spin. This function always works in object-local coordinates.</string> - </map> - <key>llTargetRemove</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Target</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Removes positional target Handle registered with llTarget.</string> - </map> - <key>llTeleportAgent</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>UUID of avatar.</string> - </map> - </map> - <map> - <key>LandmarkName</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string>Name of landmark (in object contents), or empty string, to use.</string> - </map> - </map> - <map> - <key>Position</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>If no landmark was provided, the position within the current region to teleport the avatar to.</string> - </map> - </map> - <map> - <key>LookAtPoint</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>The position within the target region that the avatar should be turned to face upon arrival.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Requests a teleport of avatar to a landmark stored in the object's inventory. If no landmark is provided (an empty string), the avatar is teleported to the location position in the current region. In either case, the avatar is turned to face the position given by look_at in local coordinates.\nRequires the PERMISSION_TELEPORT permission. This function can only teleport the owner of the object.</string> - </map> - <key>llTeleportAgentGlobalCoords</key> - <map> - <key>energy</key> - <real>0</real> - <key>sleep</key> - <real>0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string>UUID of avatar.</string> - </map> - </map> - <map> - <key>GlobalPosition</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Global coordinates of the destination region. Can be retrieved by using llRequestSimulatorData(region_name, DATA_SIM_POS).</string> - </map> - </map> - <map> - <key>RegionPosition</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>The position within the target region to teleport the avatar to, if no landmark was provided.</string> - </map> - </map> - <map> - <key>LookAtPoint</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>The position within the target region that the avatar should be turned to face upon arrival.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Teleports an agent to the RegionPosition local coordinates within a region which is specified by the GlobalPosition global coordinates. The agent lands facing the position defined by LookAtPoint local coordinates.\nRequires the PERMISSION_TELEPORT permission. This function can only teleport the owner of the object.</string> - </map> - <key>llTeleportAgentHome</key> - <map> - <key>energy</key> - <real>100.0</real> - <key>sleep</key> - <real>5.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Teleport agent over the owner's land to agent's home location.</string> - </map> - <key>llTextBox</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>1.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Opens a dialog for the specified avatar with message Text, which contains a text box for input. Any text that is entered is said on the specified Channel (as if by the avatar) when the "OK" button is clicked.</string> - </map> - <key>llToLower</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string that is Text with all lower-case characters.</string> - </map> - <key>llToUpper</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns a string that is Text with all upper-case characters.</string> - </map> - <key>llTransferLindenDollars</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Amount</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Transfer Amount of linden dollars (L$) from script owner to AvatarID. Returns a key to a corresponding transaction_result event for the success of the transfer.\nAttempts to send the amount of money to the specified avatar, and trigger a transaction_result event identified by the returned key.</string> - </map> - <key>llTriggerSound</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays Sound at Volume (0.0 - 1.0), centered at but not attached to object.\nThere is no limit to the number of triggered sounds which can be generated by an object, and calling llTriggerSound does not affect the attached sounds created by llPlaySound and llLoopSound. This is very useful for things like collision noises, explosions, etc. There is no way to stop or alter the volume of a sound triggered by this function.</string> - </map> - <key>llTriggerSoundLimited</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Sound</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Volume</key> - <map> - <key>type</key> - <string>float</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>TNE</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>BSW</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Plays Sound at Volume (0.0 - 1.0), centered at but not attached to object, limited to axis-aligned bounding box defined by vectors top-north-east (TNE) and bottom-south-west (BSW).\nThere is no limit to the number of triggered sounds which can be generated by an object, and calling llTriggerSound does not affect the attached sounds created by llPlaySound and llLoopSound. This is very useful for things like collision noises, explosions, etc. There is no way to stop or alter the volume of a sound triggered by this function.</string> - </map> - <key>llUnescapeURL</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>URL</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the string that is the URL unescaped, replacing "%20" with spaces, etc., version of URL.\nThis function can output raw UTF-8 strings.</string> - </map> - <key>llUnSit</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>AvatarID</key> - <map> - <key>type</key> - <string>key</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>If agent identified by AvatarID is sitting on the object the script is attached to or is over land owned by the objects owner, the agent is forced to stand up.</string> - </map> - <key>llUpdateCharacter</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>Character configuration options. Takes the same constants as llCreateCharacter().</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Updates settings for a pathfinding character.</string> - </map> - <key>llUpdateKeyValue</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>key</string> - <key>arguments</key> - <array> - <map> - <key>Key</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - <map> - <key>Value</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - <map> - <key>Checked</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string></string> - </map> - </map> - <map> - <key>OriginalValue</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string></string> - </map> - </map> - </array> - <key>tooltip</key> - <string> - Starts an asychronous transaction to update the value associated with the key given. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. If Checked is 1 the existing value in the data store must match the OriginalValue passed or XP_ERROR_RETRY_UPDATE will be returned. If Checked is 0 the key will be created if necessary. - </string> - </map> - <key>llVecDist</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Location1</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Location2</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the distance between Location1 and Location2.</string> - </map> - <key>llVecMag</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Vector</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the magnitude of the vector.</string> - </map> - <key>llVecNorm</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Vector</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns normalized vector.</string> - </map> - <key>llVolumeDetect</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>DetectEnabled</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string>TRUE enables, FALSE disables.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>If DetectEnabled = TRUE, object becomes phantom but triggers collision_start and collision_end events when other objects start and stop interpenetrating.\nIf another object (including avatars) interpenetrates it, it will get a collision_start event.\nWhen an object stops interpenetrating, a collision_end event is generated. While the other is inter-penetrating, collision events are NOT generated.</string> - </map> - <key>llWanderWithin</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Origin</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Central point to wander about.</string> - </map> - </map> - <map> - <key>Area</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string>Half-extents of an area the character may wander within. (i.e., it can wander from the specified origin by up to +/-Distance.x in x, +/-Distance.y in y, etc.)</string> - </map> - </map> - <map> - <key>Options</key> - <map> - <key>type</key> - <string>list</string> - <key>tooltip</key> - <string>No options available at this time.</string> - </map> - </map> - </array> - <key>tooltip</key> - <string>Wander within a specified volume.\nSets a character to wander about a central spot within a specified area.</string> - </map> - <key>llWater</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the water height below the object position + Offset.</string> - </map> - <key>llWhisper</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>void</string> - <key>arguments</key> - <array> - <map> - <key>Channel</key> - <map> - <key>type</key> - <string>integer</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Whispers Text on Channel.\nThis chat method has a range of 10m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string> - </map> - <key>llWind</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>vector</string> - <key>arguments</key> - <array> - <map> - <key>Offset</key> - <map> - <key>type</key> - <string>vector</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Returns the wind velocity at the object position + Offset.</string> - </map> - <key>llXorBase64</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text1</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text2</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Performs an exclusive OR on two Base64 strings and returns a Base64 string. Text2 repeats if it is shorter than Text1.</string> - </map> - <key>llXorBase64Strings</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.3</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text1</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text2</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Please use llXorBase64 instead.\nIncorrectly performs an exclusive OR on two Base64 strings and returns a Base64 string. Text2 repeats if it is shorter than Text1.\nRetained for backwards compatibility.</string> - </map> - <key>llXorBase64StringsCorrect</key> - <map> - <key>deprecated</key> - <boolean>true</boolean> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>string</string> - <key>arguments</key> - <array> - <map> - <key>Text1</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - <map> - <key>Text2</key> - <map> - <key>type</key> - <string>string</string> - <key>tooltip</key> - <string/> - </map> - </map> - </array> - <key>tooltip</key> - <string>Deprecated: Please use llXorBase64 instead.\nCorrectly (unless nulls are present) performs an exclusive OR on two Base64 strings and returns a Base64 string.\nText2 repeats if it is shorter than Text1.</string> - </map> - <key>llGetMinScaleFactor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the smallest multiplicative uniform scale factor that can be successfully applied (via llScaleByFactor()) to the object without violating prim size or linkability rules.</string> - </map> - <key>llGetMaxScaleFactor</key> - <map> - <key>energy</key> - <real>10.0</real> - <key>sleep</key> - <real>0.0</real> - <key>return</key> - <string>float</string> - <key>arguments</key> - <undef/> - <key>tooltip</key> - <string>Returns the largest multiplicative uniform scale factor that can be successfully applied (via llScaleByFactor()) to the object without violating prim size or linkability rules.</string> - </map> - </map> - <key>llsd-lsl-syntax-version</key> - <integer>2</integer><!-- increment only when the file format changes, not just the content --> - </map> -</llsd> diff --git a/indra/newview/app_settings/llsd.xsd b/indra/newview/app_settings/llsd.xsd index 34612d9faa..34612d9faa 100755..100644 --- a/indra/newview/app_settings/llsd.xsd +++ b/indra/newview/app_settings/llsd.xsd diff --git a/indra/newview/app_settings/message.xml b/indra/newview/app_settings/message.xml index dee3fd72dd..dee3fd72dd 100755..100644 --- a/indra/newview/app_settings/message.xml +++ b/indra/newview/app_settings/message.xml diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 68efed0a67..cacaa605be 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -514,7 +514,7 @@ <key>RecentJumpThresholdSecs</key> <map> <key>Comment</key> - <string>Seconds after a jump input during which finish-anim is suppressed to avoid interrupting rapid successive jumps.</string> + <string>Seconds after jump input during which landing finish-anim is suppressed to avoid interrupting rapid successive jumps.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -3596,17 +3596,6 @@ <key>Value</key> <string>https://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string> </map> - <key>HowToHelpURL</key> - <map> - <key>Comment</key> - <string>URL for How To help content</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]/howto/index.html</string> - </map> <key>HomeSidePanelURL</key> <map> <key>Comment</key> @@ -3629,17 +3618,6 @@ <key>Value</key> <string>https://search.[GRID]/viewer/?query_term=[QUERY]&search_type=[TYPE][COLLECTION]&maturity=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> </map> - <key>GuidebookURL</key> - <map> - <key>Comment</key> - <string>URL for Guidebook content</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>http://guidebooks.secondlife.io/welcome/index.html</string> - </map> <key>HighResSnapshot</key> <map> <key>Comment</key> @@ -5302,6 +5280,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>MediaPluginForceVLC</key> + <map> + <key>Comment</key> + <string>Force use of VLC based media plugin. (Linux Only)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>MediaControlFadeTime</key> <map> <key>Comment</key> @@ -7534,7 +7523,7 @@ <key>RenderAnisotropic</key> <map> <key>Comment</key> - <string>Render textures using anisotropic filtering</string> + <string>[OBSOLETE] Render textures using anisotropic filtering</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7542,6 +7531,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderAnisotropicLevel</key> + <map> + <key>Comment</key> + <string>Anisotropic filtering strength(0(Disable), 2x, 4x, 8x, 16x</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <real>0</real> + </map> <key>RenderAppleUseMultGL</key> <map> <key>Comment</key> @@ -7758,7 +7758,7 @@ <key>RenderHiDPI</key> <map> <key>Comment</key> - <string>Enable support for HiDPI displays, like Retina (macOS ONLY, requires restart)</string> + <string>Enable support for HiDPI displays, like Retina (macOS and Linux ONLY, requires restart)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8973,7 +8973,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>RenderGLMultiThreadedTextures</key> <map> @@ -9269,6 +9269,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>NametagOverWater</key> + <map> + <key>Comment</key> + <string>Render name tag over the transparent water while camera is above the water</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderInitError</key> <map> <key>Comment</key> @@ -10110,6 +10121,17 @@ <key>Value</key> <real>1</real> </map> + <key>CollectUIImageVertexBuffers</key> + <map> + <key>Comment</key> + <string>When enabled, images will cache vertex buffers and reuse them. When disabled, the general cache will be used with significant hash-lookup overhead, but vertices are regenerated each frame so they are always up to date.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <real>1</real> + </map> <key>ShowMyComplexityChanges</key> <map> <key>Comment</key> @@ -10411,6 +10433,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>RenderHighPrecisionPostProcess</key> + <map> + <key>Comment</key> + <string>Use 16-bit floating point buffers for post process rendering</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ReplaySession</key> <map> <key>Comment</key> @@ -13578,6 +13611,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>SwitchToSharedEnvAfterTeleport</key> + <map> + <key>Comment</key> + <string>Switch to Shared Environment after teleport</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>PreferredBrowserBehavior</key> <map> <key>Comment</key> @@ -14077,7 +14121,7 @@ <key>WLSkyDetail</key> <map> <key>Comment</key> - <string>Controls vertex detail on the WindLight sky. Lower numbers will give better performance and uglier skies.</string> + <string>[OBSOLETE]</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -14272,6 +14316,61 @@ <key>Value</key> <string /> </map> + <key>ExternalWebsocketSyncEnable</key> + <map> + <key>Comment</key> + <string>Enables the Websocket JSONRPC server when doing external script editing.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ExternalWebsocketSyncPort</key> + <map> + <key>Comment</key> + <string>Port that the JSONRPC server listens on when editing</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>9020</integer> + </map> + <key>ExternalWebsocketSyncLocal</key> + <map> + <key>Comment</key> + <string>Should the JSONRPC server listen only for local connections.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ExternalEditorTightIntegration</key> + <map> + <key>Comment</key> + <string>When true, Edit in External Editor launches VS Code via the code CLI with a vscode:// URI instead of using the configured external editor.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ExternalWebsocketForwardDebug</key> + <map> + <key>Comment</key> + <string>Forward messages and runtime errors for a script to JSONRPC client.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>YawFromMousePosition</key> <map> <key>Comment</key> @@ -15269,7 +15368,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>OutfitOperationsTimeout</key> <map> @@ -15282,6 +15381,17 @@ <key>Value</key> <integer>180</integer> </map> + <key>OSHibernationMode</key> + <map> + <key>Comment</key> + <string>Whether to prevent OS from hibernating. 0 - can hibernate; 1 - can't hibernate, can turn screen off; 2 - can't hibernate, can't turn screen off </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>HeightUnits</key> <map> <key>Comment</key> @@ -17001,6 +17111,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>CEFRemoteDebuggingPort</key> + <map> + <key>Comment</key> + <string>Enable CEF remote debugging on the specified base port (1024 to 65535, 0 to disable). Each new SLPlugin gets base+N.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>360CaptureJPEGEncodeQuality</key> <map> <key>Comment</key> @@ -17184,7 +17305,7 @@ <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>U32</string> <key>Value</key> <integer>0</integer> </map> @@ -17386,5 +17507,16 @@ <key>Value</key> <integer>0</integer> </map> + <key>ScriptEditorDisableSyntaxHighlight</key> + <map> + <key>Comment</key> + <string>Disable syntax highlighting in script editor for performance testing</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl index 10a48f1e01..a95caf91b5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl @@ -25,7 +25,6 @@ #extension GL_ARB_texture_rectangle : enable #extension GL_ARB_shader_texture_lod : enable -#extension GL_EXT_gpu_shader4 : enable /*[EXTRA_CODE_HERE]*/ diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index 8c51b4a36b..f5200719ae 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -30,9 +30,13 @@ out vec4 frag_data[4]; // The fragment shader for the sky ///////////////////////////////////////////////////////////////////////// -in vec3 vary_CloudColorSun; -in vec3 vary_CloudColorAmbient; -in float vary_CloudDensity; +// In +in vec3 pos; + +in vec2 vary_texcoord0; +in vec2 vary_texcoord1; +in vec2 vary_texcoord2; +in vec2 vary_texcoord3; uniform sampler2D cloud_noise_texture; uniform sampler2D cloud_noise_texture_next; @@ -42,11 +46,26 @@ uniform vec3 cloud_pos_density2; uniform float cloud_scale; uniform float cloud_variance; -in vec2 vary_texcoord0; -in vec2 vary_texcoord1; -in vec2 vary_texcoord2; -in vec2 vary_texcoord3; -in float altitude_blend_factor; +uniform vec3 camPosLocal; + +uniform vec3 lightnorm; +uniform vec3 sunlight_color; +uniform vec3 moonlight_color; +uniform int sun_up_factor; +uniform vec3 ambient_color; +uniform vec3 blue_horizon; +uniform vec3 blue_density; +uniform float haze_horizon; +uniform float haze_density; + +uniform float cloud_shadow; +uniform float density_multiplier; +uniform float max_y; + +uniform vec3 glow; +uniform float sun_moon_glow_factor; + +uniform vec3 cloud_color; vec4 cloudNoise(vec2 uv) { @@ -58,21 +77,111 @@ vec4 cloudNoise(vec2 uv) void main() { + if (cloud_scale < 0.001) + { + discard; + } + // Set variables vec2 uv1 = vary_texcoord0.xy; vec2 uv2 = vary_texcoord1.xy; - - vec3 cloudColorSun = vary_CloudColorSun; - vec3 cloudColorAmbient = vary_CloudColorAmbient; - float cloudDensity = vary_CloudDensity; vec2 uv3 = vary_texcoord2.xy; vec2 uv4 = vary_texcoord3.xy; - if (cloud_scale < 0.001) + // Get relative position + vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0, 50, 0); + + float altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0); + + // Set altitude + if (rel_pos.y > 0) { - discard; + rel_pos *= (max_y / rel_pos.y); + } + if (rel_pos.y < 0) + { + altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon + rel_pos *= (-32000. / rel_pos.y); } + // Can normalize then + vec3 rel_pos_norm = normalize(rel_pos); + float rel_pos_len = length(rel_pos); + + // Initialize temp variables + vec3 sunlight = sunlight_color; + vec3 light_atten; + + // Sunlight attenuation effect (hue and brightness) due to atmosphere + // this is used later for sunlight modulation at various altitudes + light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y); + + // Calculate relative weights + vec3 combined_haze = abs(blue_density) + vec3(abs(haze_density)); + vec3 blue_weight = blue_density / combined_haze; + vec3 haze_weight = haze_density / combined_haze; + + // Compute sunlight from rel_pos & lightnorm (for long rays like sky) + float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); + sunlight *= exp(-light_atten * off_axis); + + // Distance + float density_dist = rel_pos_len * density_multiplier; + + // Transparency (-> combined_haze) + // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati + // compiler gets confused. + combined_haze = exp(-combined_haze * density_dist); + + // Compute haze glow + float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); + // haze_glow is 0 at the sun and increases away from sun + haze_glow = max(haze_glow, .001); + // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + haze_glow *= glow.x; + // Higher glow.x gives dimmer glow (because next step is 1 / "angle") + haze_glow = pow(haze_glow, glow.z); + // glow.z should be negative, so we're doing a sort of (1 / "angle") function + + haze_glow *= sun_moon_glow_factor; + + // Add "minimum anti-solar illumination" + // For sun, add to glow. For moon, remove glow entirely. SL-13768 + haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); + + // Increase ambient when there are more clouds + vec3 tmpAmbient = ambient_color; + tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; + + // Dim sunlight by cloud shadow percentage + sunlight *= (1. - cloud_shadow); + + // Haze color below cloud + vec3 additiveColorBelowCloud = + (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); + + // CLOUDS + sunlight = sunlight_color; + off_axis = 1.0 / max(1e-6, lightnorm.y * 2.); + sunlight *= exp(-light_atten * off_axis); + + // Cloud color out + vec3 cloudColorSun = (sunlight * haze_glow) * cloud_color; + vec3 cloudColorAmbient = tmpAmbient * cloud_color; + + // Attenuate cloud color by atmosphere + combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds + cloudColorSun *= combined_haze; + cloudColorAmbient *= combined_haze; + vec3 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze); + + // Make a nice cloud density based on the cloud_shadow value that was passed in. + float cloudDensity = 2. * (cloud_shadow - 0.25); + + // Combine these to minimize register use + cloudColorAmbient += oHazeColorBelowCloud; + + // Cloud Fragment vec2 disturbance = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl index c019b5606a..89fbe38af0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl @@ -1,5 +1,5 @@ /** - * @file WLCloudsV.glsl + * @file class1/deferred/cloudsV.glsl * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code @@ -33,38 +33,15 @@ in vec2 texcoord0; /////////////////////////////////////////////////////////////////////////////// // Output parameters -out vec3 vary_CloudColorSun; -out vec3 vary_CloudColorAmbient; -out float vary_CloudDensity; +out vec3 pos; out vec2 vary_texcoord0; out vec2 vary_texcoord1; out vec2 vary_texcoord2; out vec2 vary_texcoord3; -out float altitude_blend_factor; // Inputs -uniform vec3 camPosLocal; - uniform vec3 lightnorm; -uniform vec3 sunlight_color; -uniform vec3 moonlight_color; -uniform int sun_up_factor; -uniform vec3 ambient_color; -uniform vec3 blue_horizon; -uniform vec3 blue_density; -uniform float haze_horizon; -uniform float haze_density; - -uniform float cloud_shadow; -uniform float density_multiplier; -uniform float max_y; - -uniform vec3 glow; -uniform float sun_moon_glow_factor; - -uniform vec3 cloud_color; - uniform float cloud_scale; // NOTE: Keep these in sync! @@ -76,6 +53,7 @@ uniform float cloud_scale; void main() { // World / view / projection + pos = position.xyz; gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); // Texture coords @@ -92,102 +70,4 @@ void main() vary_texcoord2 = vary_texcoord0 * 16.; vary_texcoord3 = vary_texcoord1 * 16.; - - // Get relative position - vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); - - altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0); - - // Set altitude - if (rel_pos.y > 0) - { - rel_pos *= (max_y / rel_pos.y); - } - if (rel_pos.y < 0) - { - altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon - rel_pos *= (-32000. / rel_pos.y); - } - - // Can normalize then - vec3 rel_pos_norm = normalize(rel_pos); - float rel_pos_len = length(rel_pos); - - // Initialize temp variables - vec3 sunlight = sunlight_color; - vec3 light_atten; - - // Sunlight attenuation effect (hue and brightness) due to atmosphere - // this is used later for sunlight modulation at various altitudes - light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y); - - // Calculate relative weights - vec3 combined_haze = abs(blue_density) + vec3(abs(haze_density)); - vec3 blue_weight = blue_density / combined_haze; - vec3 haze_weight = haze_density / combined_haze; - - // Compute sunlight from rel_pos & lightnorm (for long rays like sky) - float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); - sunlight *= exp(-light_atten * off_axis); - - // Distance - float density_dist = rel_pos_len * density_multiplier; - - // Transparency (-> combined_haze) - // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati - // compiler gets confused. - combined_haze = exp(-combined_haze * density_dist); - - // Compute haze glow - float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); - // haze_glow is 0 at the sun and increases away from sun - haze_glow = max(haze_glow, .001); - // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) - haze_glow *= glow.x; - // Higher glow.x gives dimmer glow (because next step is 1 / "angle") - haze_glow = pow(haze_glow, glow.z); - // glow.z should be negative, so we're doing a sort of (1 / "angle") function - - haze_glow *= sun_moon_glow_factor; - - // Add "minimum anti-solar illumination" - // For sun, add to glow. For moon, remove glow entirely. SL-13768 - haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); - - // Increase ambient when there are more clouds - vec3 tmpAmbient = ambient_color; - tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; - - // Dim sunlight by cloud shadow percentage - sunlight *= (1. - cloud_shadow); - - // Haze color below cloud - vec3 additiveColorBelowCloud = - (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); - - // CLOUDS - sunlight = sunlight_color; - off_axis = 1.0 / max(1e-6, lightnorm.y * 2.); - sunlight *= exp(-light_atten * off_axis); - - // Cloud color out - vary_CloudColorSun = (sunlight * haze_glow) * cloud_color; - vary_CloudColorAmbient = tmpAmbient * cloud_color; - - // Attenuate cloud color by atmosphere - combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds - vary_CloudColorSun *= combined_haze; - vary_CloudColorAmbient *= combined_haze; - vec3 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze); - - // Make a nice cloud density based on the cloud_shadow value that was passed in. - vary_CloudDensity = 2. * (cloud_shadow - 0.25); - - // Combine these to minimize register use - vary_CloudColorAmbient += oHazeColorBelowCloud; - - // needs this to compile on mac - //vary_AtmosAttenuation = vec3(0.0,0.0,0.0); - - // END CLOUDS } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 7639a5e6fc..b70d1db499 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -23,13 +23,14 @@ * $/LicenseInfo$ */ +// Outputs +out vec4 frag_data[4]; + // Inputs -in vec3 vary_HazeColor; -in float vary_LightNormPosDot; +in vec3 pos; #ifdef HAS_HDRI in vec4 vary_position; -in vec3 vary_rel_pos; uniform float sky_hdr_scale; uniform float hdri_split_screen; uniform mat3 env_mat; @@ -43,7 +44,27 @@ uniform float moisture_level; uniform float droplet_radius; uniform float ice_level; -out vec4 frag_data[4]; +uniform vec3 camPosLocal; + +uniform vec3 lightnorm; +uniform vec3 sunlight_color; +uniform vec3 moonlight_color; +uniform int sun_up_factor; +uniform vec3 ambient_color; +uniform vec3 blue_horizon; +uniform vec3 blue_density; +uniform float haze_horizon; +uniform float haze_density; + +uniform float cloud_shadow; +uniform float density_multiplier; +uniform float distance_multiplier; +uniform float max_y; + +uniform vec3 glow; +uniform float sun_moon_glow_factor; + +uniform int cube_snapshot; vec3 srgb_to_linear(vec3 c); vec3 linear_to_srgb(vec3 c); @@ -83,12 +104,25 @@ vec3 halo22(float d) void main() { + // Get relative position + vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0, 50, 0); + + // Adj position vector to clamp altitude + if (rel_pos.y > 0.) + { + rel_pos *= (max_y / rel_pos.y); + } + if (rel_pos.y < 0.) + { + rel_pos *= (-32000. / rel_pos.y); + } + vec3 color; #ifdef HAS_HDRI vec3 frag_coord = vary_position.xyz/vary_position.w; if (-frag_coord.x > ((1.0-hdri_split_screen)*2.0-1.0)) { - vec3 pos = normalize(vary_rel_pos); + vec3 pos = normalize(rel_pos); pos = env_mat * pos; vec2 texCoord = vec2(atan(pos.z, pos.x) + PI, acos(pos.y)) / vec2(2.0 * PI, PI); color = textureLod(environmentMap, texCoord.xy, 0).rgb * sky_hdr_scale; @@ -99,15 +133,75 @@ void main() else #endif { - // Potential Fill-rate optimization. Add cloud calculation - // back in and output alpha of 0 (so that alpha culling kills - // the fragment) if the sky wouldn't show up because the clouds - // are fully opaque. + // Normalized + vec3 rel_pos_norm = normalize(rel_pos); + float rel_pos_len = length(rel_pos); + + // Grab this value and pass to frag shader for rainbows + float rel_pos_lightnorm_dot = dot(rel_pos_norm, lightnorm.xyz); + + // Initialize temp variables + vec3 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color * 0.7; //magic 0.7 to match legacy color + + // Sunlight attenuation effect (hue and brightness) due to atmosphere + // this is used later for sunlight modulation at various altitudes + vec3 light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y); + + // Calculate relative weights + vec3 combined_haze = max(abs(blue_density) + vec3(abs(haze_density)), vec3(1e-6)); + vec3 blue_weight = blue_density / combined_haze; + vec3 haze_weight = haze_density / combined_haze; + + // Compute sunlight from rel_pos & lightnorm (for long rays like sky) + float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); + sunlight *= exp(-light_atten * off_axis); + + // Distance + float density_dist = rel_pos_len * density_multiplier; + + // Transparency (-> combined_haze) + // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati + // compiler gets confused. + combined_haze = exp(-combined_haze * density_dist); + + // Compute haze glow + float haze_glow = 1.0 - rel_pos_lightnorm_dot; + // haze_glow is 0 at the sun and increases away from sun + haze_glow = max(haze_glow, .001); + // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + haze_glow *= glow.x; + // Higher glow.x gives dimmer glow (because next step is 1 / "angle") + haze_glow = pow(haze_glow, glow.z); + // glow.z should be negative, so we're doing a sort of (1 / "angle") function + + // Add "minimum anti-solar illumination" + // For sun, add to glow. For moon, remove glow entirely. SL-13768 + haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25)); + + // Haze color above cloud + color = (blue_horizon * blue_weight * (sunlight + ambient_color) + + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)); + + // Final atmosphere additive + color *= (1. - combined_haze); + + // Increase ambient when there are more clouds + vec3 ambient = ambient_color + max(vec3(0), (1. - ambient_color)) * cloud_shadow * 0.5; + + // Dim sunlight by cloud shadow percentage + sunlight *= max(0.0, (1. - cloud_shadow)); + + // Haze color below cloud + vec3 add_below_cloud = (blue_horizon * blue_weight * (sunlight + ambient) + + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient)); + + // Attenuate cloud color by atmosphere + combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds - color = vary_HazeColor; + // At horizon, blend high altitude sky color towards the darker color below the clouds + color += (add_below_cloud - color) * (1. - sqrt(combined_haze)); - float rel_pos_lightnorm = vary_LightNormPosDot; - float optic_d = rel_pos_lightnorm; + float optic_d = rel_pos_lightnorm_dot; vec3 halo_22 = halo22(optic_d); color.rgb += rainbow(optic_d); color.rgb += halo_22; diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index ea00d240df..836ad66098 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -1,5 +1,5 @@ /** - * @file WLSkyV.glsl + * @file class1/deferred/skyV.glsl * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code @@ -32,36 +32,13 @@ in vec3 position; /////////////////////////////////////////////////////////////////////////////// // Output parameters -out vec3 vary_HazeColor; -out float vary_LightNormPosDot; +out vec3 pos; #ifdef HAS_HDRI out vec4 vary_position; -out vec3 vary_rel_pos; #endif // Inputs -uniform vec3 camPosLocal; - -uniform vec3 lightnorm; -uniform vec3 sunlight_color; -uniform vec3 moonlight_color; -uniform int sun_up_factor; -uniform vec3 ambient_color; -uniform vec3 blue_horizon; -uniform vec3 blue_density; -uniform float haze_horizon; -uniform float haze_density; - -uniform float cloud_shadow; -uniform float density_multiplier; -uniform float distance_multiplier; -uniform float max_y; - -uniform vec3 glow; -uniform float sun_moon_glow_factor; - -uniform int cube_snapshot; // NOTE: Keep these in sync! // indra\newview\app_settings\shaders\class1\deferred\skyV.glsl @@ -70,97 +47,13 @@ uniform int cube_snapshot; void main() { // World / view / projection - vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); - - gl_Position = pos; - - // Get relative position - vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); - -#ifdef HAS_HDRI - vary_rel_pos = rel_pos; - vary_position = pos; -#endif - - // Adj position vector to clamp altitude - if (rel_pos.y > 0.) - { - rel_pos *= (max_y / rel_pos.y); - } - if (rel_pos.y < 0.) - { - rel_pos *= (-32000. / rel_pos.y); - } - - // Normalized - vec3 rel_pos_norm = normalize(rel_pos); - float rel_pos_len = length(rel_pos); - - // Grab this value and pass to frag shader for rainbows - float rel_pos_lightnorm_dot = dot(rel_pos_norm, lightnorm.xyz); - vary_LightNormPosDot = rel_pos_lightnorm_dot; - - // Initialize temp variables - vec3 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color * 0.7; //magic 0.7 to match legacy color - - // Sunlight attenuation effect (hue and brightness) due to atmosphere - // this is used later for sunlight modulation at various altitudes - vec3 light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y); - - // Calculate relative weights - vec3 combined_haze = max(abs(blue_density) + vec3(abs(haze_density)), vec3(1e-6)); - vec3 blue_weight = blue_density / combined_haze; - vec3 haze_weight = haze_density / combined_haze; - - // Compute sunlight from rel_pos & lightnorm (for long rays like sky) - float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); - sunlight *= exp(-light_atten * off_axis); - - // Distance - float density_dist = rel_pos_len * density_multiplier; - - // Transparency (-> combined_haze) - // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati - // compiler gets confused. - combined_haze = exp(-combined_haze * density_dist); - - // Compute haze glow - float haze_glow = 1.0 - rel_pos_lightnorm_dot; - // haze_glow is 0 at the sun and increases away from sun - haze_glow = max(haze_glow, .001); - // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) - haze_glow *= glow.x; - // Higher glow.x gives dimmer glow (because next step is 1 / "angle") - haze_glow = pow(haze_glow, glow.z); - // glow.z should be negative, so we're doing a sort of (1 / "angle") function - - // Add "minimum anti-solar illumination" - // For sun, add to glow. For moon, remove glow entirely. SL-13768 - haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25)); - - // Haze color above cloud - vec3 color = (blue_horizon * blue_weight * (sunlight + ambient_color) - + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color)); - - // Final atmosphere additive - color *= (1. - combined_haze); - - // Increase ambient when there are more clouds - vec3 ambient = ambient_color + max(vec3(0), (1. - ambient_color)) * cloud_shadow * 0.5; - - // Dim sunlight by cloud shadow percentage - sunlight *= max(0.0, (1. - cloud_shadow)); - - // Haze color below cloud - vec3 add_below_cloud = (blue_horizon * blue_weight * (sunlight + ambient) - + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient)); + pos = position.xyz; - // Attenuate cloud color by atmosphere - combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds + vec4 transformed_pos = modelview_projection_matrix * vec4(position.xyz, 1.0); - // At horizon, blend high altitude sky color towards the darker color below the clouds - color += (add_below_cloud - color) * (1. - sqrt(combined_haze)); + gl_Position = transformed_pos; - // Haze color above cloud - vary_HazeColor = color; + #ifdef HAS_HDRI + vary_position = transformed_pos; + #endif } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl index 5d770948c5..36eac9ed51 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl @@ -27,10 +27,10 @@ out vec3 vary_AdditiveColor; out vec3 vary_AtmosAttenuation; -vec3 additive_color; -vec3 atmos_attenuation; -vec3 sunlit_color; -vec3 amblit_color; +vec3 additive_color = vec3(1.0, 1.0, 1.0); +vec3 atmos_attenuation = vec3(1.0, 1.0, 1.0); +vec3 sunlit_color = vec3(1.0, 1.0, 1.0); +vec3 amblit_color = vec3(1.0, 1.0, 1.0); vec3 getSunlitColor() { diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index b08193a7dd..691c4aab81 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -255,8 +255,8 @@ void main() vec3 amblit_linear = amblit; vec3 irradiance = amblit; - vec3 glossenv; - vec3 legacyenv; + vec3 glossenv = vec3(0.0); + vec3 legacyenv = vec3(0.0); sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, frag, pos.xyz, norm.xyz, 0.0, 0.0, true, amblit_linear); diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl index 0418f99459..5b5827fd67 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl @@ -188,8 +188,8 @@ void main() vec3 radiance = vec3(0); sampleReflectionProbes(irradiance, radiance, vary_position.xy*0.5+0.5, pos.xyz, norm.xyz, gloss, true, amblit); - vec3 diffuseColor; - vec3 specularColor; + vec3 diffuseColor = vec3(0.0); + vec3 specularColor = vec3(0.0); calcDiffuseSpecular(col.rgb, metallic, diffuseColor, specularColor); vec3 v = -normalize(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl index 5e38864d38..0bb1b90dce 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -78,9 +78,9 @@ void main() float env_intensity = vertex_color.a; - vec3 ambenv; - vec3 glossenv; - vec3 legacyenv; + vec3 ambenv = vec3(1.0); + vec3 glossenv = vec3(0.0); + vec3 legacyenv = vec3(0.0); vec3 norm = normalize(vary_texcoord1.xyz); vec4 spec = vec4(0,0,0,0); sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false, amblit); diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index 9b6b2e5b33..ad7c5b7235 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -261,7 +261,7 @@ void alphaMask(float alpha) #endif } -void waterClip() +void applyWaterClip() { #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) waterClip(vary_position.xyz); @@ -283,17 +283,17 @@ float getShadow(vec3 pos, vec3 norm) #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) return sampleDirectionalShadow(pos, norm, vary_texcoord0.xy); #else - return 1.; + return 1.0; #endif #else - return 1.; + return 1.0; #endif } void main() { mirrorClip(vary_position); - waterClip(); + applyWaterClip(); // diffcol == diffuse map combined with vertex color vec4 diffcol = texture(diffuseMap, vary_texcoord0.xy); @@ -336,8 +336,8 @@ void main() vec3 amblit_linear = amblit; vec3 ambenv = amblit; - vec3 glossenv; - vec3 legacyenv; + vec3 glossenv = vec3(0.0); + vec3 legacyenv = vec3(0.0); sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env, true, amblit_linear); color = ambenv; @@ -440,5 +440,3 @@ void main() #endif } - - diff --git a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl index e8901c7ba2..c9a19f4278 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl @@ -323,7 +323,7 @@ float tapScreenSpaceReflection(int totalSamples, vec2 tc, vec3 viewPos, vec3 n, { #ifdef TRANSPARENT_SURFACE collectedColor = vec4(1, 0, 1, 1); - return 0; + return 0.0; #endif collectedColor = vec4(0); int hits = 0; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 2b42d757cb..1ecdaf24b5 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -179,8 +179,8 @@ void main() adjustIrradiance(irradiance, ambocc); - vec3 diffuseColor; - vec3 specularColor; + vec3 diffuseColor = vec3(0.0); + vec3 specularColor = vec3(0.0); calcDiffuseSpecular(baseColor.rgb, metallic, diffuseColor, specularColor); vec3 v = -normalize(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index c2167dfcba..52b3727da9 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -120,9 +120,7 @@ vec3 linear_to_srgb(vec3 col); vec3 atmosLighting(vec3 light); vec3 toneMapNoExposure(vec3 color); -vec3 vN, vT, vB; - -vec3 transform_normal(vec3 vNt) +vec3 transform_normal(vec3 vN, vec3 vT, vec3 vB, vec3 vNt) { return normalize(vNt.x * vT + vNt.y * vB + vNt.z * vN); } @@ -184,9 +182,9 @@ void main() { mirrorClip(vary_position); - vN = vary_normal; - vT = vary_tangent; - vB = cross(vN, vT); + vec3 vN = vary_normal; + vec3 vT = vary_tangent; + vec3 vB = cross(vN, vT); vec3 pos = vary_position.xyz; float linear_depth = 1.0 / -pos.z; @@ -222,14 +220,14 @@ void main() vec3 waver = wavef*3.0; - vec3 up = transform_normal(vec3(0,0,1)); + vec3 up = transform_normal(vN, vT, vB, vec3(0,0,1)); float vdu = -dot(viewVec, up)*2.0; vec3 wave_ibl = wavef * normScale; wave_ibl.z *= 2.0; - wave_ibl = transform_normal(normalize(wave_ibl)); + wave_ibl = transform_normal(vN, vT, vB, normalize(wave_ibl)); - vec3 norm = transform_normal(normalize(wavef)); + vec3 norm = transform_normal(vN, vT, vB, normalize(wavef)); vdu = clamp(vdu, 0.0, 1.0); //wavef.z *= max(vdu*vdu*vdu, 0.1); @@ -237,7 +235,7 @@ void main() wavef = normalize(wavef); //wavef = vec3(0, 0, 1); - wavef = transform_normal(wavef); + wavef = transform_normal(vN, vT, vB, wavef); float dist2 = dist; dist = max(dist, 5.0); @@ -312,7 +310,7 @@ void main() vec3 colorEmissive = vec3(0); float ao = 1.0; - vec3 light_dir = transform_normal(lightDir); + vec3 light_dir = transform_normal(vN, vT, vB, lightDir); float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0); diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml index cd900b6c60..5655eb8166 100644 --- a/indra/newview/app_settings/toolbars.xml +++ b/indra/newview/app_settings/toolbars.xml @@ -22,6 +22,5 @@ <right_toolbar button_display_mode="icons_only"> <command name="performance"/> - <command name="howto"/> </right_toolbar> </toolbars> diff --git a/indra/newview/build_win32_appConfig.py b/indra/newview/build_win32_appConfig.py deleted file mode 100755 index 1bfcc7a9bc..0000000000 --- a/indra/newview/build_win32_appConfig.py +++ /dev/null @@ -1,68 +0,0 @@ -# @file build_win32_appConfig.py -# @brief Create the windows app.config file to redirect crt linkage. -# -# $LicenseInfo:firstyear=2009&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$ - -import sys, os, re -from xml.dom.minidom import parse - -def munge_binding_redirect_version(src_manifest_name, src_config_name, dst_config_name): - manifest_dom = parse(src_manifest_name) - node = manifest_dom.getElementsByTagName('assemblyIdentity')[0] - manifest_assm_ver = node.getAttribute('version') - - config_dom = parse(src_config_name) - node = config_dom.getElementsByTagName('bindingRedirect')[0] - node.setAttribute('newVersion', manifest_assm_ver) - src_old_ver = re.match('([^-]*-).*', node.getAttribute('oldVersion')).group(1) - node.setAttribute('oldVersion', src_old_ver + manifest_assm_ver) - comment = config_dom.createComment("This file is automatically generated by the build. see indra/newview/build_win32_appConfig.py") - config_dom.insertBefore(comment, config_dom.childNodes[0]) - - print("Writing: " + dst_config_name) - f = open(dst_config_name, 'w') - config_dom.writexml(f) - f.close() - - - -def main(): - config = sys.argv[1] - src_dir = sys.argv[2] - dst_dir = sys.argv[3] - dst_name = sys.argv[4] - - if config.lower() == 'debug': - src_manifest_name = dst_dir + '/Microsoft.VC80.DebugCRT.manifest' - src_config_name = src_dir + '/SecondLifeDebug.exe.config' - else: - src_manifest_name = dst_dir + '/Microsoft.VC80.CRT.manifest' - src_config_name = src_dir + '/SecondLife.exe.config' - - dst_config_name = dst_dir + '/' + dst_name - - munge_binding_redirect_version(src_manifest_name, src_config_name, dst_config_name) - - return 0 - -if __name__ == "__main__": - main() diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 1090dd8ffb..c6487586f9 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -27,7 +27,7 @@ version 74 // NOTE: All settings are set to the MIN of applied values, including 'all'! // list all -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 16 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 @@ -56,7 +56,6 @@ RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderCompressTextures 1 1 @@ -87,12 +86,13 @@ RenderTonemapMix 1 1 RenderDisableVintageMode 1 1 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Low Graphics Settings // list Low -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarLODFactor 1 0 RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxNonImpostors 1 3 @@ -113,7 +113,6 @@ RenderTreeLODFactor 1 0 RenderVolumeLODFactor 1 1.125 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 RenderScreenSpaceReflections 1 0 @@ -130,12 +129,13 @@ RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 512 RenderReflectionProbeCount 1 1 +RenderHighPrecisionPostProcess 1 0 // // Medium Low Graphics Settings // list LowMid -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 0.5 RenderAvatarMaxComplexity 1 100000 RenderAvatarPhysicsLODFactor 1 0.75 @@ -156,7 +156,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 RenderScreenSpaceReflections 1 0 @@ -173,12 +172,13 @@ RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 1024 RenderReflectionProbeCount 1 32 +RenderHighPrecisionPostProcess 1 0 // // Medium Graphics Settings (standard) // list Mid -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 200000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -197,7 +197,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.25 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 1 RenderFSAASamples 1 1 RenderReflectionsEnabled 1 1 @@ -215,12 +214,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 64 +RenderHighPrecisionPostProcess 1 0 // // Medium High Graphics Settings // list MidHigh -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 250000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -239,7 +239,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.375 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 1 RenderFSAASamples 1 1 RenderReflectionsEnabled 1 1 @@ -257,12 +256,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 64 +RenderHighPrecisionPostProcess 1 0 // // High Graphics Settings (SSAO + sun shadows) // list High -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 300000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -281,7 +281,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.5 RenderDeferredSSAO 1 1 RenderShadowDetail 1 1 -WLSkyDetail 1 96 RenderFSAAType 1 2 RenderFSAASamples 1 2 RenderReflectionsEnabled 1 1 @@ -299,12 +298,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 128 +RenderHighPrecisionPostProcess 1 0 // -// High Ultra Graphics Settings (deferred + SSAO + all shadows) +// High Ultra Graphics Settings (SSAO + all shadows) // list HighUltra -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 350000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -323,7 +323,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.75 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -WLSkyDetail 1 96 RenderFSAAType 1 2 RenderFSAASamples 1 2 RenderReflectionsEnabled 1 1 @@ -341,12 +340,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Ultra graphics (REALLY PURTY!) // list Ultra -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 8 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 RenderAvatarPhysicsLODFactor 1 1.0 @@ -363,7 +363,6 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVolumeLODFactor 1 2.0 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 RenderFSAAType 1 2 @@ -383,6 +382,7 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Class Unknown Hardware (unknown) @@ -400,10 +400,16 @@ list VRAMGT512 RenderCompressTextures 1 0 // +// AF Missing or AF < 2 +// +list AnisotropicMissing +RenderAnisotropicLevel 0 0 + +// // "Default" setups for safe, low, medium, high // list safe -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarMaxNonImpostors 1 16 RenderAvatarMaxComplexity 1 80000 RenderLocalLightCount 1 0 @@ -419,7 +425,7 @@ RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 0 0 list Intel -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderFSAAType 1 0 RenderFSAASamples 1 0 RenderGLContextCoreProfile 1 0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index f97ff28062..5d2819169e 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,10 +1,10 @@ -version 30 +version 35 // 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 // defaults. This should be as rare an event as we can manage. -// NOTE: This is mostly identical to featuretable_mac.txt with a few differences +// NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table // @@ -27,29 +27,28 @@ version 30 // NOTE: All settings are set to the MIN of applied values, including 'all'! // list all -RenderAnisotropic 1 1 -RenderAvatarCloth 1 1 +RenderAnisotropicLevel 1 16 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 RenderAvatarMaxComplexity 1 350000 RenderAutoMuteSurfaceAreaLimit 1 1000.0 RenderCubeMap 1 1 -RenderDelayVBUpdate 1 0 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 RenderFogRatio 1 4.0 RenderGamma 1 0 RenderGlowResolutionPow 1 9 -RenderGround 1 1 RenderMaxPartCount 1 8192 RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 4 +RenderLocalLightCount 1 4096 +RenderTransparentWater 1 1 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 -RenderTransparentWater 1 1 +RenderTerrainPBRPlanarSampleCount 1 3 RenderTreeLODFactor 1 1.0 RenderVBOEnable 1 1 RenderVBOMappingDisable 1 1 @@ -57,64 +56,43 @@ RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderCompressTextures 1 1 RenderShaderLightingMaxLevel 1 3 +RenderReflectionProbeLevel 1 3 RenderDeferred 1 1 RenderDeferredSSAO 1 1 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 -RenderFSAASamples 1 16 +RenderUseStreamVBO 1 1 +RenderFSAAType 1 2 +RenderFSAASamples 1 3 RenderMaxTextureIndex 1 16 +RenderGLContextCoreProfile 1 1 +RenderGLMultiThreadedTextures 1 0 +RenderGLMultiThreadedMedia 1 0 +RenderReflectionProbeResolution 1 128 +RenderScreenSpaceReflections 1 1 RenderMirrors 1 1 - -// -// Low Graphics Settings (fixed function) -// -list LowFixedFunction -RenderAnisotropic 1 0 -RenderAvatarCloth 1 0 -RenderAvatarLODFactor 1 0 -RenderAvatarPhysicsLODFactor 1 0 -RenderAvatarMaxNonImpostors 1 3 -RenderAvatarMaxComplexity 1 25000 -RenderFarClip 1 64 -RenderFlexTimeFactor 1 0 -RenderGlowResolutionPow 1 8 -RenderLocalLights 1 0 -RenderMaxPartCount 1 0 -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 -WindLightUseAtmosShaders 1 0 -RenderDeferred 1 0 -RenderDeferredSSAO 1 0 -RenderUseAdvancedAtmospherics 1 0 -RenderShadowDetail 1 0 -WLSkyDetail 1 48 -RenderFSAASamples 1 0 -RenderMirrors 1 0 -RenderHeroProbeResolution 1 256 -RenderHeroProbeDistance 1 4 -RenderHeroProbeUpdateRate 1 6 +RenderHeroProbeResolution 1 2048 +RenderHeroProbeDistance 1 16 +RenderHeroProbeUpdateRate 1 6 RenderHeroProbeConservativeUpdateMultiplier 1 16 +RenderDownScaleMethod 1 0 +RenderCASSharpness 1 1 RenderExposure 1 4 RenderTonemapType 1 1 RenderTonemapMix 1 1 +RenderDisableVintageMode 1 1 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Low Graphics Settings // list Low -RenderAnisotropic 1 0 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarLODFactor 1 0 RenderAvatarPhysicsLODFactor 1 0 RenderAvatarMaxNonImpostors 1 3 @@ -122,304 +100,298 @@ RenderAvatarMaxComplexity 1 35000 RenderFarClip 1 64 RenderFlexTimeFactor 1 0 RenderGlowResolutionPow 1 8 -RenderLocalLights 1 0 +RenderLocalLightCount 1 8 RenderMaxPartCount 1 0 -RenderObjectBump 1 0 -RenderReflectionDetail 1 0 +RenderTransparentWater 1 0 +RenderReflectionsEnabled 1 0 +RenderReflectionProbeDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 -RenderTransparentWater 1 0 +RenderTerrainPBRDetail 1 -4 +RenderTerrainPBRPlanarSampleCount 1 1 RenderTreeLODFactor 1 0 -RenderTerrainPBRDetail 1 -1 RenderVolumeLODFactor 1 1.125 -WindLightUseAtmosShaders 1 0 -RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 48 +RenderFSAAType 1 0 RenderFSAASamples 1 0 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 0 RenderMirrors 1 0 RenderHeroProbeResolution 1 256 RenderHeroProbeDistance 1 4 -RenderHeroProbeUpdateRate 1 6 +RenderHeroProbeUpdateRate 1 6 RenderHeroProbeConservativeUpdateMultiplier 1 16 +RenderCASSharpness 1 0 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderDisableVintageMode 1 0 +RenderMaxTextureResolution 1 512 +RenderReflectionProbeCount 1 1 +RenderHighPrecisionPostProcess 1 0 // // Medium Low Graphics Settings // list LowMid -RenderAnisotropic 1 0 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarLODFactor 1 0.5 RenderAvatarMaxComplexity 1 100000 RenderAvatarPhysicsLODFactor 1 0.75 +RenderAvatarMaxNonImpostors 1 5 RenderFarClip 1 96 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 8 RenderMaxPartCount 1 2048 -RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 0 +RenderLocalLightCount 1 256 +RenderTransparentWater 1 0 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 -RenderTransparentWater 1 1 +RenderTerrainPBRDetail 1 -1 +RenderTerrainPBRPlanarSampleCount 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 -RenderTerrainPBRDetail 1 -1 -WindLightUseAtmosShaders 1 0 -RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 48 +RenderFSAAType 1 0 RenderFSAASamples 1 0 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 0 RenderMirrors 1 0 RenderHeroProbeResolution 1 256 RenderHeroProbeDistance 1 6 RenderHeroProbeUpdateRate 1 3 RenderHeroProbeConservativeUpdateMultiplier 1 16 +RenderCASSharpness 1 0 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderDisableVintageMode 1 0 +RenderMaxTextureResolution 1 1024 +RenderReflectionProbeCount 1 32 +RenderHighPrecisionPostProcess 1 0 // // Medium Graphics Settings (standard) // list Mid -RenderAnisotropic 1 1 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 200000 RenderAvatarPhysicsLODFactor 1 1.0 +RenderAvatarMaxNonImpostors 1 7 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 9 RenderMaxPartCount 1 4096 -RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 0 +RenderLocalLightCount 1 512 +RenderTransparentWater 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 -RenderTransparentWater 1 1 +RenderTerrainPBRPlanarSampleCount 1 1 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.125 -WindLightUseAtmosShaders 1 1 -RenderDeferred 1 0 +RenderVolumeLODFactor 1 1.25 RenderDeferredSSAO 1 0 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 48 -RenderFSAASamples 1 2 +RenderFSAAType 1 1 +RenderFSAASamples 1 1 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 0 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 1 RenderMirrors 1 0 RenderHeroProbeResolution 1 512 RenderHeroProbeDistance 1 6 RenderHeroProbeUpdateRate 1 3 RenderHeroProbeConservativeUpdateMultiplier 1 16 +RenderCASSharpness 1 0 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 +RenderHighPrecisionPostProcess 1 0 // -// Medium High Graphics Settings (deferred enabled) +// Medium High Graphics Settings // list MidHigh -RenderAnisotropic 1 1 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 250000 RenderAvatarPhysicsLODFactor 1 1.0 +RenderAvatarMaxNonImpostors 1 9 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 9 RenderMaxPartCount 1 4096 -RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 0 +RenderLocalLightCount 1 1024 +RenderTransparentWater 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 -RenderTransparentWater 1 1 +RenderTerrainPBRPlanarSampleCount 1 1 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.125 -WindLightUseAtmosShaders 1 1 -RenderDeferred 1 1 -RenderUseAdvancedAtmospherics 1 0 +RenderVolumeLODFactor 1 1.375 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 48 -RenderFSAASamples 1 2 +RenderFSAAType 1 1 +RenderFSAASamples 1 1 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 1 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 1 RenderMirrors 1 0 RenderHeroProbeResolution 1 512 RenderHeroProbeDistance 1 6 RenderHeroProbeUpdateRate 1 2 RenderHeroProbeConservativeUpdateMultiplier 1 8 +RenderCASSharpness 1 0 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 +RenderHighPrecisionPostProcess 1 0 // -// High Graphics Settings (deferred + SSAO) +// High Graphics Settings (SSAO + sun shadows) // list High -RenderAnisotropic 1 1 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 300000 RenderAvatarPhysicsLODFactor 1 1.0 +RenderAvatarMaxNonImpostors 1 11 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 9 RenderMaxPartCount 1 4096 -RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 0 +RenderLocalLightCount 1 2048 +RenderTransparentWater 1 1 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 -RenderTransparentWater 1 1 +RenderTerrainPBRPlanarSampleCount 1 3 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.125 -WindLightUseAtmosShaders 1 1 -RenderDeferred 1 1 +RenderVolumeLODFactor 1 1.5 RenderDeferredSSAO 1 1 -RenderUseAdvancedAtmospherics 1 0 -RenderShadowDetail 1 0 -WLSkyDetail 1 48 +RenderShadowDetail 1 1 +RenderFSAAType 1 2 RenderFSAASamples 1 2 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 1 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 2 RenderMirrors 1 0 RenderHeroProbeResolution 1 512 RenderHeroProbeDistance 1 8 RenderHeroProbeUpdateRate 1 2 RenderHeroProbeConservativeUpdateMultiplier 1 8 +RenderCASSharpness 1 0.4 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 128 +RenderHighPrecisionPostProcess 1 0 // -// High Ultra Graphics Settings (deferred + SSAO + shadows) +// High Ultra Graphics Settings (SSAO + all shadows) // list HighUltra -RenderAnisotropic 1 1 -RenderAvatarCloth 1 0 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 350000 RenderAvatarPhysicsLODFactor 1 1.0 +RenderAvatarMaxNonImpostors 1 16 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 9 RenderMaxPartCount 1 4096 -RenderObjectBump 1 1 -RenderLocalLights 1 1 -RenderReflectionDetail 1 0 +RenderLocalLightCount 1 4096 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 +RenderTerrainPBRPlanarSampleCount 1 3 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.125 -WindLightUseAtmosShaders 1 1 -RenderDeferred 1 1 +RenderVolumeLODFactor 1 1.75 RenderDeferredSSAO 1 1 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 -WLSkyDetail 1 48 +RenderFSAAType 1 2 RenderFSAASamples 1 2 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 1 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 3 RenderMirrors 1 0 -RenderHeroProbeResolution 1 512 +RenderHeroProbeResolution 1 1024 RenderHeroProbeDistance 1 16 RenderHeroProbeUpdateRate 1 1 RenderHeroProbeConservativeUpdateMultiplier 1 4 +RenderCASSharpness 1 0.4 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Ultra graphics (REALLY PURTY!) // list Ultra -RenderAnisotropic 1 1 -RenderAvatarCloth 1 1 +RenderAnisotropicLevel 1 8 RenderAvatarLODFactor 1 1.0 +RenderAvatarMaxNonImpostors 1 16 RenderAvatarPhysicsLODFactor 1 1.0 RenderFarClip 1 256 RenderFlexTimeFactor 1 1.0 RenderGlowResolutionPow 1 9 -RenderLocalLights 1 1 +RenderLocalLightCount 1 8192 RenderMaxPartCount 1 8192 -RenderObjectBump 1 1 -RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTerrainPBRDetail 1 0 +RenderTerrainPBRPlanarSampleCount 1 3 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVolumeLODFactor 1 2.0 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 -RenderDeferred 1 1 RenderDeferredSSAO 1 1 -RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 -RenderFSAASamples 1 2 +RenderFSAAType 1 2 +RenderFSAASamples 1 3 +RenderReflectionsEnabled 1 1 +RenderReflectionProbeDetail 1 1 +RenderScreenSpaceReflections 1 0 +RenderReflectionProbeLevel 1 3 RenderMirrors 1 0 -RenderHeroProbeResolution 1 1024 +RenderHeroProbeResolution 1 2048 RenderHeroProbeDistance 1 16 RenderHeroProbeUpdateRate 1 1 RenderHeroProbeConservativeUpdateMultiplier 1 4 +RenderCASSharpness 1 0.4 RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Class Unknown Hardware (unknown) // list Unknown -RenderVBOEnable 1 0 RenderShadowDetail 1 0 -RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderUseAdvancedAtmospherics 1 0 - -// -// Class 0 Hardware (just old) -// -list Class0 -RenderVBOEnable 1 1 - -// -// Class 1 Hardware -// -list Class1 -RenderVBOEnable 1 1 - -// -// Class 2 Hardware -// -list Class2 -RenderVBOEnable 1 1 - -// -// Class 3 Hardware -// -list Class3 -RenderVBOEnable 1 1 - -// -// Class 4 Hardware -// -list Class4 -RenderVBOEnable 1 1 - -// -// Class 5 Hardware -// -list Class5 -RenderVBOEnable 1 1 +RenderMirrors 1 0 +RenderDisableVintageMode 1 0 // // VRAM > 512MB @@ -428,341 +400,58 @@ list VRAMGT512 RenderCompressTextures 1 0 // -// No Pixel Shaders available -// -list NoPixelShaders -RenderAvatarCloth 0 0 -RenderReflectionDetail 0 0 -WindLightUseAtmosShaders 0 0 -RenderDeferred 0 0 -RenderDeferredSSAO 0 0 -RenderUseAdvancedAtmospherics 0 0 -RenderShadowDetail 0 0 - -// -// No Vertex Shaders available +// AF Missing or AF < 2 // -list NoVertexShaders -RenderAvatarCloth 0 0 -RenderReflectionDetail 0 0 -WindLightUseAtmosShaders 0 0 -RenderDeferred 0 0 -RenderDeferredSSAO 0 0 -RenderUseAdvancedAtmospherics 0 0 -RenderShadowDetail 0 0 - -// -// GL_ARB_map_buffer_range exists -// -list MapBufferRange -RenderVBOMappingDisable 1 1 - +list AnisotropicMissing +RenderAnisotropicLevel 0 0 // // "Default" setups for safe, low, medium, high // list safe -RenderAnisotropic 1 0 -RenderAvatarCloth 0 0 +RenderAnisotropicLevel 1 0 RenderAvatarMaxNonImpostors 1 16 RenderAvatarMaxComplexity 1 80000 -RenderObjectBump 0 0 -RenderLocalLights 1 0 +RenderLocalLightCount 1 0 RenderMaxPartCount 1 1024 RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 -RenderReflectionDetail 0 0 -WindLightUseAtmosShaders 0 0 -RenderDeferred 0 0 +RenderTransparentWater 1 0 RenderDeferredSSAO 0 0 -RenderUseAdvancedAtmospherics 0 0 RenderShadowDetail 0 0 - -// -// CPU based feature masks -// - -// 1Ghz or less (equiv) -list CPUSlow -RenderMaxPartCount 1 1024 - -// -// RAM based feature masks -// -list RAM256MB -RenderObjectBump 0 0 - -// -// Graphics card based feature masks -// -list OpenGLPre15 -RenderVBOEnable 1 0 - -list OpenGLPre30 -RenderDeferred 0 0 -RenderMaxTextureIndex 1 1 +RenderReflectionProbeDetail 0 -1 +RenderMirrors 0 0 +RenderDisableVintageMode 1 0 +RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 0 0 list Intel -RenderAnisotropic 1 0 -// Avoid some Intel crashes on Linux -RenderCubeMap 0 0 +RenderAnisotropicLevel 1 0 +RenderFSAAType 1 0 RenderFSAASamples 1 0 +RenderGLContextCoreProfile 1 0 +RenderGLMultiThreadedMedia 1 0 +RenderDownScaleMethod 1 0 -list GeForce2 -RenderAnisotropic 1 0 -RenderMaxPartCount 1 2048 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 1 - -list SiS -UseOcclusion 0 0 +list AMD +RenderGLMultiThreadedTextures 1 0 +list NVIDIA +RenderGLMultiThreadedMedia 1 1 -list Intel_830M -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_845G -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_855GM -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_865G -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_900 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_915GM -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_915G -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_945GM -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_945G -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_950 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_965 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 -UseOcclusion 0 0 - -list Intel_G33 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_Bear_Lake -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_Broadwater -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_Brookdale -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_Montara -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - -list Intel_Springdale -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 - - -list ATI_FireGL_5200 -RenderVBOEnable 1 0 -WindLightUseAtmosShaders 0 0 - - -list ATI_Mobility_Radeon_7xxx -RenderVBOEnable 0 0 - -list ATI_Radeon_7xxx -RenderVBOEnable 0 0 - -list ATI_All-in-Wonder_Radeon -RenderVBOEnable 0 0 - -list ATI_All-in-Wonder_7500 -RenderVBOEnable 0 0 - -list ATI_Mobility_Radeon_9600 -Disregard96DefaultDrawDistance 1 0 - - -/// tweaked ATI to 96 Draw distance - -list ATI_Radeon_9000 -Disregard96DefaultDrawDistance 1 0 -list ATI_Radeon_9200 -Disregard96DefaultDrawDistance 1 0 -list ATI_Radeon_9500 -Disregard96DefaultDrawDistance 1 0 -list ATI_Radeon_9600 -Disregard96DefaultDrawDistance 1 0 - -/// tweaked ATI to 128 draw distance - -list ATI_Radeon_X300 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X400 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X500 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X600 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X700 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X1300 -Disregard128DefaultDrawDistance 1 0 -UseStartScreen 0 0 -list ATI_Radeon_X1400 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X1500 -Disregard128DefaultDrawDistance 1 0 -UseStartScreen 0 0 -list ATI_Radeon_X1600 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_X1700 -Disregard128DefaultDrawDistance 1 0 -list ATI_Mobility_Radeon_X1xxx -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2300 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2400 -Disregard128DefaultDrawDistance 1 0 -list ATI_ASUS_AH24xx -Disregard128DefaultDrawDistance 1 0 - - -// Avatar hardware skinning causes invisible avatars -// on various ATI chipsets on drivers before 8.2 - -list ATIOldDriver -RenderAvatarCloth 0 0 -// Avoid driver crashes with some features on Linux with old ATI drivers -UseOcclusion 0 0 -WindLightUseAtmosShaders 0 0 - - -/// Tweaked NVIDIA - -list NVIDIA_GeForce_FX_5100 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_5200 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_5500 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_5600 -Disregard96DefaultDrawDistance 1 0 - -list NVIDIA_GeForce_FX_Go5100 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_Go5200 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_Go5300 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_Go5500 -Disregard96DefaultDrawDistance 1 0 -list NVIDIA_GeForce_FX_Go5600 -Disregard96DefaultDrawDistance 1 0 - -list NVIDIA_GeForce_6100 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_6200 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_6500 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_6600 -Disregard128DefaultDrawDistance 1 0 - -list NVIDIA_G73 -Disregard128DefaultDrawDistance 1 0 - -list NVIDIA_GeForce_Go_6100 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6200 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6500 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6600 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6700 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6800 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 -list NVIDIA_GeForce_Go_6 -RenderVBOEnable 1 0 -Disregard128DefaultDrawDistance 1 0 - -list NVIDIA_GeForce_7000 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7100 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7200 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7300 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7400 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7500 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7600 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7700 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7800 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_7900 -RenderShaderLightingMaxLevel 1 2 - -list NVIDIA_GeForce_Go_7200 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7300 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7300_LE -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7400 -Disregard128DefaultDrawDistance 1 0 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7600 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7700 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7800 -RenderShaderLightingMaxLevel 1 2 -list NVIDIA_GeForce_Go_7900 -RenderShaderLightingMaxLevel 1 2 +list GL3 +RenderFSAAType 0 0 +RenderFSAASamples 0 0 +RenderReflectionsEnabled 0 0 +RenderReflectionProbeDetail 0 0 +RenderMirrors 0 0 +RenderGLMultiThreadedTextures 0 0 +RenderGLMultiThreadedMedia 0 0 +RenderDisableVintageMode 1 0 +RenderReflectionProbeCount 0 0 list TexUnit16orLess RenderTerrainPBRDetail 1 -1 + +list VaryingVectors16orLess +RenderTerrainPBRPlanarSampleCount 1 1 + diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 6cbbb92f50..c5f69c4c73 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -27,7 +27,7 @@ version 73 // NOTE: All settings are set to the MIN of applied values, including 'all'! // list all -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 16 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 @@ -54,7 +54,6 @@ RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderCompressTextures 1 1 @@ -87,12 +86,13 @@ RenderDisableVintageMode 1 1 RenderDownScaleMethod 1 0 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Low Graphics Settings // list Low -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarLODFactor 1 0.5 RenderAvatarMaxComplexity 1 35000 RenderAvatarPhysicsLODFactor 1 0.5 @@ -111,7 +111,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 RenderReflectionsEnabled 1 1 @@ -129,15 +128,15 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 512 -//RenderReflectionProbeCount 1 1 RenderReflectionProbeCount 1 4 RenderReflectionProbeDrawDistance 1 16.0 +RenderHighPrecisionPostProcess 1 0 // // Medium Low Graphics Settings // list LowMid -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarLODFactor 1 0.5 RenderAvatarMaxComplexity 1 100000 RenderAvatarPhysicsLODFactor 1 0.75 @@ -156,7 +155,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 2.0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 RenderReflectionsEnabled 1 1 @@ -174,15 +172,15 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 1024 -//RenderReflectionProbeCount 1 32 RenderReflectionProbeCount 1 16 RenderReflectionProbeDrawDistance 1 24.0 +RenderHighPrecisionPostProcess 1 0 // // Medium Graphics Settings (standard) // list Mid -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 200000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -201,7 +199,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 2.5 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 1 RenderFSAASamples 1 0 RenderReflectionsEnabled 1 1 @@ -220,12 +217,13 @@ RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 64 RenderReflectionProbeDrawDistance 1 32.0 +RenderHighPrecisionPostProcess 1 0 // // Medium High Graphics Settings // list MidHigh -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 250000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -244,7 +242,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 3.5 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -WLSkyDetail 1 96 RenderFSAAType 1 1 RenderFSAASamples 1 1 RenderReflectionsEnabled 1 1 @@ -262,12 +259,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 64 +RenderHighPrecisionPostProcess 1 0 // // High Graphics Settings (SSAO + sun shadows) // list High -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxComplexity 1 300000 RenderAvatarPhysicsLODFactor 1 1.0 @@ -286,7 +284,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 3.8 RenderDeferredSSAO 1 1 RenderShadowDetail 1 1 -WLSkyDetail 1 96 RenderFSAAType 1 1 RenderFSAASamples 1 2 RenderReflectionsEnabled 1 1 @@ -304,12 +301,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 128 +RenderHighPrecisionPostProcess 1 0 // // High Ultra Graphics Settings (SSAO + all shadows) // list HighUltra -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 2 RenderAvatarLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 RenderAvatarMaxComplexity 1 350000 @@ -328,7 +326,6 @@ RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 4.0 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -WLSkyDetail 1 96 RenderFSAAType 1 2 RenderFSAASamples 1 2 RenderReflectionsEnabled 1 1 @@ -346,12 +343,13 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 RenderReflectionProbeCount 1 256 +RenderHighPrecisionPostProcess 1 1 // // Ultra graphics (REALLY PURTY!) // list Ultra -RenderAnisotropic 1 1 +RenderAnisotropicLevel 1 4 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxNonImpostors 1 16 @@ -368,7 +366,6 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVolumeLODFactor 1 4.0 WindLightUseAtmosShaders 1 1 -WLSkyDetail 1 128 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 RenderFSAAType 1 2 @@ -406,10 +403,16 @@ list VRAMGT512 RenderCompressTextures 1 0 // +// AF Missing or AF < 2 +// +list AnisotropicMissing +RenderAnisotropicLevel 0 0 + +// // "Default" setups for safe, low, medium, high // list safe -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderAvatarMaxNonImpostors 1 3 RenderAvatarMaxComplexity 1 80000 RenderLocalLightCount 1 0 @@ -439,7 +442,7 @@ RenderGLMultiThreadedMedia 1 0 RenderAppleUseMultGL 1 0 list Intel -RenderAnisotropic 1 0 +RenderAnisotropicLevel 1 0 RenderFSAASamples 1 0 RenderGLMultiThreadedTextures 1 0 RenderGLMultiThreadedMedia 1 0 diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp index f0ad3fa594..900c1da170 100644 --- a/indra/newview/gltf/accessor.cpp +++ b/indra/newview/gltf/accessor.cpp @@ -213,7 +213,7 @@ bool Buffer::save(Asset& asset, const std::string& folder) bin_file += mUri; - std::ofstream file(bin_file, std::ios::binary); + llofstream file(bin_file, 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 d44aa9d72c..c170672859 100644 --- a/indra/newview/gltf/asset.cpp +++ b/indra/newview/gltf/asset.cpp @@ -928,8 +928,8 @@ bool Asset::save(const std::string& filename) // save .gltf object obj; serialize(obj); - std::string buffer = boost::json::serialize(obj); - std::ofstream file(filename, std::ios::binary); + std::string buffer = boost::json::serialize(obj, {}); + llofstream file(filename, std::ios::binary); file.write(buffer.c_str(), buffer.size()); return true; @@ -1129,7 +1129,7 @@ bool Image::save(Asset& asset, const std::string& folder) // set URI to non-j2c file for now, but later we'll want to reference the j2c hash mUri = name + extension; - std::ofstream file(filename, std::ios::binary); + llofstream file(filename, std::ios::binary); file.write((const char*)buffer.mData.data() + bufferView.mByteOffset, bufferView.mByteLength); } else if (mTexture.notNull()) diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp index 5a94a2c6c6..1bdc915bd5 100644 --- a/indra/newview/gltf/llgltfloader.cpp +++ b/indra/newview/gltf/llgltfloader.cpp @@ -507,7 +507,7 @@ void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32> } else { - setLoadState(ERROR_MODEL + pModel->getStatus()); + setLoadState(static_cast<U32>(ERROR_MODEL) + static_cast<U32>(pModel->getStatus())); delete pModel; return; } @@ -1398,6 +1398,24 @@ void LLGLTFLoader::populateJointsFromSkin(S32 skin_idx) buildOverrideMatrix(viewer_data, joints_data, names_to_nodes, ident, ident); } + // Precompute the source bind pose in viewer coordinate space so each + // joint can later be remapped against its own GLTF rest matrix. This + // keeps bind-pose deltas local to the joint hierarchy. Without this, + // a source skeleton whose parent joints carry bind-pose rotations that + // the viewer skeleton does not have can leak those rotations into + // child joints with different local bases. + joint_node_mat4_map_t rotated_bind_matrices; + joint_node_mat4_map_t converted_bind_matrices; + if (inverse_count > 0) + { + for (S32 i = 0; i < joint_count && i < inverse_count; i++) + { + S32 joint = skin.mJoints[i]; + glm::mat4 original_bind_matrix = glm::inverse(skin.mInverseBindMatricesData[i]); + rotated_bind_matrices[joint] = rotateGltfMatrixToViewerSpace(original_bind_matrix); + } + } + for (S32 i = 0; i < joint_count; i++) { S32 joint = skin.mJoints[i]; @@ -1430,12 +1448,19 @@ void LLGLTFLoader::populateJointsFromSkin(S32 skin_idx) } 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); + // Translate existing bind matrices to the viewer skeleton by + // preserving each joint's bind-pose delta from its own GLTF rest + // matrix. The previous world-space remap applied one skeleton + // transform directly to each bind matrix; when a source parent has + // bind-pose rotation that the viewer parent does not, that rotation + // could get baked into child inverse binds. Keeping the delta local + // fixes the resulting child joint twists. + glm::mat4 translated_original = computeViewerBindMatrix( + joints_data, + rotated_bind_matrices, + joint, + converted_bind_matrices); + glm::mat4 final_inverse_bind_matrix = glm::inverse(translated_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; @@ -1551,6 +1576,12 @@ void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map glm::quat rotation; glm::decompose(translated_joint, scale, rotation, translation_override, skew, perspective); + glm::mat4 viewer_rotation_scale(1.0f); + viewer_rotation_scale = glm::rotate(viewer_rotation_scale, glm::radians(viewer_data.mRotation[0]), glm::vec3(1, 0, 0)); + viewer_rotation_scale = glm::rotate(viewer_rotation_scale, glm::radians(viewer_data.mRotation[1]), glm::vec3(0, 1, 0)); + viewer_rotation_scale = glm::rotate(viewer_rotation_scale, glm::radians(viewer_data.mRotation[2]), glm::vec3(0, 0, 1)); + viewer_rotation_scale = glm::scale(viewer_rotation_scale, viewer_data.mScale); + // 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)); @@ -1566,13 +1597,14 @@ void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map } 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); + // Collision volumes need the imported translation override, but + // their local rotation-scale basis must come from the raw viewer + // skeleton XML values. For non-uniform torso volumes, matching DAE + // requires viewer rotation followed by viewer scale. + overriden_joint = viewer_rotation_scale; + overriden_joint[3][0] = translation_override.x; + overriden_joint[3][1] = translation_override.y; + overriden_joint[3][2] = translation_override.z; node.mOverrideRestMatrix = parent_support_rest * overriden_joint; } } @@ -1651,6 +1683,69 @@ glm::mat4 LLGLTFLoader::buildGltfRestMatrix(S32 joint_node_index, const joints_d return data.mGltfMatrix; } +// Convert a GLTF-space transform into the viewer coordinate space used by +// skeleton override and bind-pose calculations. Keeping this conversion in +// one helper ensures bind and rest matrices use the same rotation path, +// including the optional XY rotation applied for compatible uploads. +glm::mat4 LLGLTFLoader::rotateGltfMatrixToViewerSpace(const glm::mat4& gltf_matrix) const +{ + glm::mat4 rotated = coord_system_rotation * gltf_matrix; + if (mApplyXYRotation) + { + rotated = coord_system_rotationxy * rotated; + } + return rotated; +} + +// Convert one GLTF bind matrix to the matching viewer bind matrix. The +// function derives the joint-local bind delta from the GLTF bind and rest +// matrices, then applies that same delta to the viewer override rest matrix. +// Results are cached because child calculations can request the same joint +// more than once while preserving local hierarchy behavior. +glm::mat4 LLGLTFLoader::computeViewerBindMatrix( + const joints_data_map_t& joints_data_map, + const joint_node_mat4_map_t& rotated_bind_matrices, + S32 gltf_node_index, + joint_node_mat4_map_t& converted_bind_matrices) const +{ + auto cached = converted_bind_matrices.find(gltf_node_index); + if (cached != converted_bind_matrices.end()) + { + return cached->second; + } + + auto node_iter = joints_data_map.find(gltf_node_index); + if (node_iter == joints_data_map.end()) + { + return glm::mat4(1.f); + } + + const JointNodeData& node_data = node_iter->second; + if (!node_data.mIsOverrideValid) + { + // No valid override, falling back to rest matrix. + glm::mat4 fallback_bind = rotateGltfMatrixToViewerSpace(node_data.mGltfRestMatrix); + converted_bind_matrices[gltf_node_index] = fallback_bind; + return fallback_bind; + } + + auto bind_iter = rotated_bind_matrices.find(gltf_node_index); + if (bind_iter == rotated_bind_matrices.end()) + { + converted_bind_matrices[gltf_node_index] = node_data.mOverrideRestMatrix; + return node_data.mOverrideRestMatrix; + } + + glm::mat4 gltf_joint_node = rotateGltfMatrixToViewerSpace(node_data.mGltfRestMatrix); + glm::mat4 gltf_joint_bind = bind_iter->second; + glm::mat4 viewer_joint_node = node_data.mOverrideRestMatrix; + glm::mat4 bind_delta = gltf_joint_bind * glm::inverse(gltf_joint_node); + glm::mat4 viewer_joint_bind = bind_delta * viewer_joint_node; + + converted_bind_matrices[gltf_node_index] = viewer_joint_bind; + return viewer_joint_bind; +} + // This function computes the transformation matrix needed to convert from GLTF skeleton space // to viewer skeleton space for a specific joint @@ -1835,7 +1930,7 @@ std::string LLGLTFLoader::extractTextureToTempFile(S32 textureIndex, const std:: "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); + llofstream temp_file(temp_filename, std::ios::binary); if (temp_file.is_open()) { temp_file.write(reinterpret_cast<const char*>(data_ptr), data_size); @@ -1903,4 +1998,3 @@ std::string LLGLTFLoader::getLodlessLabel(const LL::GLTF::Node& node) } return node.mName; } - diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h index a847e567a6..d8aad79883 100644 --- a/indra/newview/gltf/llgltfloader.h +++ b/indra/newview/gltf/llgltfloader.h @@ -160,6 +160,8 @@ private: 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 rotateGltfMatrixToViewerSpace(const glm::mat4& gltf_matrix) const; + glm::mat4 computeViewerBindMatrix(const joints_data_map_t& joints_data_map, const joint_node_mat4_map_t& rotated_bind_matrices, S32 gltf_node_index, joint_node_mat4_map_t& converted_bind_matrices) 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); diff --git a/indra/newview/installers/darwin/dmg-cleanup.applescript b/indra/newview/installers/darwin/dmg-cleanup.applescript index 866bf31e8f..866bf31e8f 100755..100644 --- a/indra/newview/installers/darwin/dmg-cleanup.applescript +++ b/indra/newview/installers/darwin/dmg-cleanup.applescript diff --git a/indra/newview/installers/darwin/release-dmg/Applications-alias.r b/indra/newview/installers/darwin/release-dmg/Applications-alias.r index f9be0536c6..f9be0536c6 100755..100644 --- a/indra/newview/installers/darwin/release-dmg/Applications-alias.r +++ b/indra/newview/installers/darwin/release-dmg/Applications-alias.r diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store Binary files differindex 747ca961d8..747ca961d8 100755..100644 --- a/indra/newview/installers/darwin/release-dmg/_DS_Store +++ b/indra/newview/installers/darwin/release-dmg/_DS_Store diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi index 7cc70e4c76..7cc70e4c76 100755..100644 --- a/indra/newview/installers/windows/lang_de.nsi +++ b/indra/newview/installers/windows/lang_de.nsi diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi Binary files differindex 364cc9f67e..364cc9f67e 100755..100644 --- a/indra/newview/installers/windows/lang_es.nsi +++ b/indra/newview/installers/windows/lang_es.nsi diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi Binary files differindex 2f34c0c87a..2f34c0c87a 100755..100644 --- a/indra/newview/installers/windows/lang_fr.nsi +++ b/indra/newview/installers/windows/lang_fr.nsi diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi Binary files differindex 51214d3a9c..51214d3a9c 100755..100644 --- a/indra/newview/installers/windows/lang_it.nsi +++ b/indra/newview/installers/windows/lang_it.nsi diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi Binary files differindex 296703d1a3..296703d1a3 100755..100644 --- a/indra/newview/installers/windows/lang_ja.nsi +++ b/indra/newview/installers/windows/lang_ja.nsi diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi Binary files differindex 542c8654b5..542c8654b5 100755..100644 --- a/indra/newview/installers/windows/lang_pt-br.nsi +++ b/indra/newview/installers/windows/lang_pt-br.nsi diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi Binary files differindex 4e53a4957d..4e53a4957d 100755..100644 --- a/indra/newview/installers/windows/lang_ru.nsi +++ b/indra/newview/installers/windows/lang_ru.nsi diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi Binary files differindex bae5029ad1..bae5029ad1 100755..100644 --- a/indra/newview/installers/windows/lang_tr.nsi +++ b/indra/newview/installers/windows/lang_tr.nsi diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi Binary files differindex 0985663041..0985663041 100755..100644 --- a/indra/newview/installers/windows/lang_zh.nsi +++ b/indra/newview/installers/windows/lang_zh.nsi diff --git a/indra/newview/licenses-linux.txt b/indra/newview/licenses-linux.txt index d443bd3385..ee487a73d0 100644 --- a/indra/newview/licenses-linux.txt +++ b/indra/newview/licenses-linux.txt @@ -446,3 +446,197 @@ 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. + +DejaVu Fonts +MIT License + +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +@@ -41,17 +42,17 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +@@ -91,9 +92,96 @@ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +Twemoji Fonts +MIT License + +Applies to "EmojiOne SVGinOT Font" code only +Copyright (c) 2022 Brad Erickson + +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. + +WebRTC + +Copyright (c) 2011, The WebRTC project authors. 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 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. + +Google fonts +SIL OPEN FONT LICENSE Version 1.1 + +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index 39c81da447..636fd62916 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -709,3 +709,206 @@ 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. + +============== +DejaVu Fonts +============== +MIT License + +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +@@ -41,17 +42,17 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +@@ -91,9 +92,96 @@ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +============== +Twemoji Fonts +============== +MIT License + +Applies to "EmojiOne SVGinOT Font" code only +Copyright (c) 2022 Brad Erickson + +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. + +============== +WebRTC +============== + +Copyright (c) 2011, The WebRTC project authors. 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 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. + +============== +Google fonts +============== +SIL OPEN FONT LICENSE Version 1.1 + +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt index 946743f789..ea35f74358 100644 --- a/indra/newview/licenses-win32.txt +++ b/indra/newview/licenses-win32.txt @@ -693,3 +693,205 @@ 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. + +============== +DejaVu Fonts +============== +MIT License + +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +@@ -41,17 +42,17 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +@@ -91,9 +92,96 @@ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +============== +Twemoji Fonts +============== +MIT License + +Applies to "EmojiOne SVGinOT Font" code only +Copyright (c) 2022 Brad Erickson + +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. + +============== +WebRTC +============== + +Copyright (c) 2011, The WebRTC project authors. 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 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. + +============== +Google fonts +============== +SIL OPEN FONT LICENSE Version 1.1 + +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/indra/newview/linux_tools/client-readme-joystick.txt b/indra/newview/linux_tools/client-readme-joystick.txt deleted file mode 100644 index 4f89a73ccb..0000000000 --- a/indra/newview/linux_tools/client-readme-joystick.txt +++ /dev/null @@ -1,78 +0,0 @@ -Second Life - Joystick & SpaceNavigator Support README --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -WHAT IS IT? --=-=-=-=-=- - -This feature allows the use of a joystick or other supported multi-axis -device for controlling your avatar and camera. - -REQUIREMENTS --=-=-=-=-=-= - -* A joystick or other generic multi-axis input device supported by your chosen - version of Linux - -- OR - - -* A SpaceNavigator device (additional configuration may be required, see below) - -Success has been reported on the following systems so far: -* Ubuntu 7.04 (Feisty) with a generic USB joystick -* Ubuntu 7.04 (Feisty) with a USB 3DConnexion SpaceNavigator -* Ubuntu 6.06 (Dapper) with a generic USB joystick -* Ubuntu 6.06 (Dapper) with a USB 3DConnexion SpaceNavigator - -CONFIGURATION --=-=-=-=-=-=- - -SPACE NAVIGATOR: *Important* - do not install the Linux SpaceNavigator -drivers from the disk included with the device - these are problematic. -Some distributions of Linux (such as Ubuntu, Gentoo and Mandriva) will -need some system configuration to make the SpaceNavigator usable by -applications such as the Second Life Viewer, as follows: - -* Mandriva Linux Configuration: - You need to add two new files to your system. This only needs to be - done once. These files are available at the 'SpaceNavigator support with - udev and Linux input framework' section of - <http://www.aaue.dk/~janoc/index.php?n=Personal.Downloads> - -* Ubuntu or Gentoo Linux Configuration: - For a quick start, you can simply paste the following line into a terminal - before plugging in your SpaceNavigator - this only needs to be done once: - sudo bash -c 'echo KERNEL==\"event[0-9]*\", SYSFS{idVendor}==\"046d\", SYSFS{idProduct}==\"c626\", SYMLINK+=\"input/spacenavigator\", GROUP=\"plugdev\", MODE=\"664\" > /etc/udev/rules.d/91-spacenavigator-LL.rules ; echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><deviceinfo version=\"0.2\"><device><match key=\"info.product\" contains=\"3Dconnexion SpaceNavigator\"><merge key=\"input.x11_driver\" type=\"string\"></merge></match></device></deviceinfo>" > /etc/hal/fdi/policy/3Dconnexion_SpaceNavigator_LL.fdi' - -For more comprehensive Linux SpaceNavigator configuration information please -see the section 'Installing SpaceNavigator without the official driver' here: -<http://www.aaue.dk/~janoc/index.php?n=Personal.3DConnexionSpaceNavigatorSupport> - -JOYSTICKS: These should be automatically detected and configured on all -modern distributions of Linux. - -ALL: Your joystick or SpaceNavigator should be plugged-in before you start the -Second Life Viewer, so that it may be detected. If you have multiple input -devices attached, only the first detected SpaceNavigator or joystick device -will be available. - -Once your system recognises your joystick or SpaceNavigator correctly, you -can go into the Second Life Viewer's Preferences dialog, click the 'Input & -Camera' tab, and click the 'Joystick Setup' button. From here you may enable -and disable joystick support and change some configuration settings such as -sensitivity. SpaceNavigator users are recommended to click the -'SpaceNavigator Defaults' button. - -KNOWN PROBLEMS --=-=-=-=-=-=-= - -* If your chosen version of Linux treats your joystick/SpaceNavigator as -if it were a mouse when you plug it in (i.e. it is automatically used to control -your desktop cursor), then the SL Viewer may detect this device *but* will be -unable to use it properly. - -FURTHER PROBLEMS? --=-=-=-=-=-=-=-=- - -Please report further issues to the public Second Life issue-tracker -at <http://jira.secondlife.com/> (please note, however, that this is not -a support forum). diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt deleted file mode 100644 index bfefdf3471..0000000000 --- a/indra/newview/linux_tools/client-readme-voice.txt +++ /dev/null @@ -1,81 +0,0 @@ -Second Life - Linux Voice Support README --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -WHAT IS IT? --=-=-=-=-=- - -Linux Voice Support is a feature in testing which allows users of the Linux -Second Life client to participate in voice-chat with other residents and -groups inside Second Life, with an appropriate headset/microphone. - -REQUIREMENTS --=-=-=-=-=-= - -* A headset/microphone supported by your chosen version of Linux -* At this time, the PulseAudio audio system is recommended; this software - is already part of most modern (2009+) Linux desktop systems. Alternatively, - the ALSA audio system may be used on systems installed from around - 2007 onwards (again this is likely already installed on your system). - -TESTING YOUR SETTINGS --=-=-=-=-=-=-=-=-=-=- - -* The Second Life region 'Voice Echo Canyon' is a great place for testing -your hardware settings and quality - it will 'echo' your voice back to you -when you speak. - -KNOWN PROBLEMS --=-=-=-=-=-=-= - -* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper - from 2006) is poor. - -TROUBLESHOOTING --=-=-=-=-=-=-=- - -PROBLEM 1: I don't see a white dot over the head of my avatar or other - Voice-using avatars. -SOLUTION: -a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the - Preferences window, and that you are in a voice-enabled area. -b. If the above does not help, exit Second Life and ensure that any - remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar) - are killed before restarting. - -PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone - except myself listed in the Active Speakers dialog when I'm sure that other - residents nearby are active Voice users. -SOLUTION: This is an incompatibility between the Voice support and your - system's audio (ALSA) driver version/configuration. -a. Back-up and remove your ~/.asoundrc file, re-test. -b. Check for updates to your kernel, kernel modules and ALSA-related - packages using your Linux distribution's package-manager - install these, - reboot and re-test. -c. Update to the latest version of ALSA manually. For a guide, see the - 'Update to the Latest Version of ALSA' section of this page: - <https://help.ubuntu.com/community/HdaIntelSoundHowto> or the official - documentation on the ALSA site: <http://www.alsa-project.org/> - reboot - and re-test. - -PROBLEM 3: I can hear other people, but they cannot hear me. -SOLUTION: -a. Ensure that you have the 'Speak' button (at the bottom of the Second Life - window) activated while you are trying to speak. -b. Ensure that your microphone jack is inserted into the correct socket of your - sound card, where appropriate. -c. Use your system mixer-setting program (such as the PulseAudio 'volume - control' applet or the ALSA 'alsamixer' program) to ensure that microphone - input is set as the active input source and is not muted. -d. Verify that audio input works in other applications, i.e. Audacity - -PROBLEM 4: Other people just hear bursts of loud noise when I speak. -SOLUTION: -a. Use your system mixer-setting program or the 'alsamixer' program to ensure - that microphone Gain/Boost is not set too high. - -FURTHER PROBLEMS? --=-=-=-=-=-=-=-=- - -Please report further issues to the public Second Life issue-tracker -at <http://jira.secondlife.com/> (please note, however, that this is not -a support forum). diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt deleted file mode 100644 index cb8d1af535..0000000000 --- a/indra/newview/linux_tools/client-readme.txt +++ /dev/null @@ -1,244 +0,0 @@ -Second Life - Linux Beta README --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -This document contains information about the Second Life Linux -client, and isn't meant to serve as an introduction to Second -Life itself - please see <http://www.secondlife.com/whatis/>. - -1. Introduction -2. System Requirements -3. Installing & Running -4. Known Issues -5. Troubleshooting - 5.1. 'Error creating window.' - 5.2. System hangs - 5.3. Blank window after minimizing it - 5.4. Audio - 5.5. 'Alt' key for camera controls doesn't work - 5.6. In-world streaming movie, music and Flash playback -6. Advanced Troubleshooting - 6.1. Audio - 6.2. OpenGL -7. Obtaining and working with the client source code -8. Getting more help, and reporting problems - - -1. INTRODUCTION --=-=-=-=-=-=-=- - -Hi! This is a BETA release of the Second Life client for Linux. -The 'beta' status means that although we're still smoothing-out a few rough -edges, this version of the client is functionally complete and should -work quite well 'out of the box' for accessing Second Life. - -We encourage you to try it out and let us know of its compatibility -with your system. Be aware that although this is a 'beta' client, it connects -to the main Second Life world and changes you make there are permanent. - -You will have either obtained this client from secondlife.com (the official -site) or from a third-party packager; if you encounter any problems then -we recommend trying the latest official builds from secondlife.com which are -updated often. - -Please enjoy! - - -2. SYSTEM REQUIREMENTS --=-=-=-=-=-=-=-=-=-=-= - -Minimum requirements: - * Internet Connection: Cable or DSL - * Computer Processor: 800MHz Pentium III or Athlon or better - (recommended: 1.5GHz or more) - * Computer Memory: 512MB (recommended: 768MB or more) - * Linux Operating System: A reasonably modern 32-bit Linux environment - is required. If you are running a 64-bit Linux distribution then - you will need its 32-bit compatibility environment installed, but - this configuration is not currently supported. - * PulseAudio or ALSA Linux system sound software. A recent PulseAudio - is the recommended configuration; see README-linux-voice.txt for more - information. - * Video/Graphics Card: - o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the - following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600, - 8800, Go 7400, Go 7600, Go 7800, Go 7900, +) - o OR ATI Radeon 8500, 9250, or better - (nVidia cards are recommended for the Linux client) - - **NOTE**: Second Life absolutely requires you to have recent, correctly- - configured OpenGL 3D drivers for your hardware - the graphics drivers - that came with your operating system may not be good enough! See the - TROUBLESHOOTING section if you encounter problems starting Second Life. - -For a more comfortable experience, the RECOMMENDED hardware for the Second -Life Linux client is very similar to that for Windows, as detailed at: -<https://secondlife.com/corporate/sysreqs.php> - - -3. INSTALLING & RUNNING --=-=-=-=-=-=-=-=-=-=-=- - -The Second Life Linux client can entirely run from the directory you have -unpacked it into - no installation step is required. If you wish to -perform a separate installation step anyway, you may run './install.sh' - -Run ./secondlife from the installation directory to start Second Life. - -For in-world MOVIE and MUSIC PLAYBACK, you will need (32-bit) GStreamer 0.10 -installed on your system. This is optional - it is not required for general -client functionality. If you have GStreamer 0.10 installed, the selection of -in-world movies you can successfully play will depend on the GStreamer -plugins you have; if you cannot play a certain in-world movie then you are -probably missing the appropriate GStreamer plugin on your system - you may -be able to install it (see TROUBLESHOOTING). - -User data is stored in the hidden directory ~/.secondlife by default; you may -override this location with the SECONDLIFE_USER_DIR environment variable if -you wish. - - -4. KNOWN ISSUES --=-=-=-=-=-=-=- - -* No significant known issues at this time. - - -5. TROUBLESHOOTING --=-=-=-=-=-=-=-=-= - -The client prints a lot of diagnostic information to the console it was -run from. Most of this is also replicated in ~/.secondlife/logs/SecondLife.log -- this is helpful to read when troubleshooting, especially 'WARNING' and -'ERROR' lines. - -VOICE PROBLEMS? See the separate README-linux-voice.txt file for Voice - troubleshooting information. - -SPACENAVIGATOR OR JOYSTICK PROBLEMS? See the separate - README-linux-joystick.txt file for configuration information. - -PROBLEM 1:- Second Life fails to start up, with a warning on the console like: - 'Error creating window.' or - 'Unable to create window, be sure screen is set at 32-bit color' or - 'SDL: Couldn't find matching GLX visual.' -SOLUTION:- Usually this indicates that your graphics card does not meet - the minimum requirements, or that your system's OpenGL 3D graphics driver is - not updated and configured correctly. If you believe that your graphics - card DOES meet the minimum requirements then you likely need to install the - official so-called 'non-free' nVidia or ATI (fglrx) graphics drivers; we - suggest one of the following options: - * Consult your Linux distribution's documentation for installing these - official drivers. For example, Ubuntu provides documentation here: - <https://help.ubuntu.com/community/BinaryDriverHowto> - * If your distribution does not make it easy, then you can download the - required Linux drivers straight from your graphics card manufacturer: - - nVidia cards: <http://www.nvidia.com/object/unix.html> - - ATI cards: <http://ati.amd.com/support/driver.html> - -PROBLEM 2:- My whole system seems to hang when running Second Life. -SOLUTION:- This is typically a hardware/driver issue. The first thing to - do is to check that you have the most recent official drivers for your - graphics card (see PROBLEM 1). -SOLUTION:- Some residents with ATI cards have reported that running - 'sudo aticonfig --locked-userpages=off' before running Second Life solves - their stability issues. -SOLUTION:- As a last resort, you can disable most of Second Life's advanced - graphics features by editing the 'secondlife' script and removing the '#' - from the line which reads '#export LL_GL_NOEXT=x' - -PROBLEM 3:- After I minimize the Second Life window, it's just blank when - it comes back. -SOLUTION:- Some Linux desktop 'Visual Effects' features are incompatible - with Second Life. One reported solution is to use your desktop - configuration program to disable such effects. For example, on Ubuntu 7.10, - use the desktop toolbar menu to select System -> Preferences -> Appearance, - then change 'Visual Effects' to 'None'. - -PROBLEM 4:- Music and sound effects are silent or very stuttery. -SOLUTION:- The most common solution is to ensure that you have the 'esd' - program (part of the 'esound' package) installed and running before you - start Second Life. Users of Ubuntu (and some other) Linux systems can - simply run the following to install and configure 'esound': - sudo apt-get install esound - For others, simply running 'esd&' from a command-line should get it running. - -PROBLEM 5:- Using the 'Alt' key to control the camera doesn't work or just - moves the Second Life window. -SOLUTION:- Some window managers eat the Alt key for their own purposes; you - can configure your window manager to use a different key instead (for - example, the 'Windows' key!) which will allow the Alt key to function - properly with mouse actions in Second Life and other applications. - -PROBLEM 6:- In-world movie, music, or Flash playback doesn't work for me. -SOLUTION:- You need to have a working installation of GStreamer 0.10; this - is usually an optional package for most versions of Linux. If you have - installed GStreamer 0.10 and you can play some music/movies but not others - then you need to install a wider selection of GStreamer plugins, either - from your vendor (i.e. the 'Ugly' plugins) or an appropriate third party. - For Flash playback, you need to have Flash 10 installed for your normal - web browser (for example, Firefox). PulseAudio is required for Flash - volume control / muting to fully function inside Second Life. - - -6. ADVANCED TROUBLESHOOTING --=-=-=-=-=-=-=-=-=-=-=-=-=- - -The 'secondlife' script which launches Second Life contains some -configuration options for advanced troubleshooters. - -* AUDIO - Edit the 'secondlife' script and you will see these audio - options: LL_BAD_OPENAL_DRIVER, LL_BAD_FMODSTUDIO_DRIVER. - Second Life tries to use OpenAL, FMODSTUDIO (PULSEAUDIO, ALSA) - audio drivers in this order; you may uncomment the corresponding LL_BAD_* - option to skip an audio driver which you believe may be causing you trouble. - -* OPENGL - For advanced troubleshooters, the LL_GL_BLACKLIST option lets - you disable specific GL extensions, each of which is represented by a - letter ("a"-"o"). If you can narrow down a stability problem on your system - to just one or two GL extensions then please post details of your hardware - (and drivers) to the Linux Client Testers forum (see link below) along - with the minimal LL_GL_BLACKLIST which solves your problems. This will help - us to improve stability for your hardware while minimally impacting - performance. - LL_GL_BASICEXT and LL_GL_NOEXT should be commented-out for this to be useful. - - -7. OBTAINING AND WORKING WITH THE CLIENT SOURCE CODE --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -We're pleased to have released the Second Life client's source code under -an Open Source license compatible with the 'GPL'. To get involved with client -development, please see: -<http://wiki.secondlife.com/wiki/Open_Source_Portal> - - -8. GETTING MORE HELP AND REPORTING PROBLEMS --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -For general help and support with Second Life: -<http://secondlife.com/community/support.php> - -For problems and discussion concerning unofficial (not secondlife.com) -releases, please contact your packager or the SLDev mailing list: -<https://lists.secondlife.com/cgi-bin/mailman/listinfo/sldev> - -In-world help: Please use the 'Help' menu in the client for various -non-Linux-specific Second Life help options. - -In-world discussion: There is a 'Linux Client Users' group -inside Second Life which is free to join. You can find it by pressing -the 'Search' button at the bottom of the window and then selecting the -'Groups' tab and searching for 'Linux'. This group is useful for discussing -Linux issues with fellow Linux client users who are online. - -The Second Life Issue Tracker: -<http://jira.secondlife.com/> -This is the right place for finding known issues and reporting new -bugs in all Second Life releases if you find that the Troubleshooting -section in this file hasn't helped (please note, however, that this is -not a support forum). - -Linux Client Testers forum: -<http://forums.secondlife.com/forumdisplay.php?forumid=263> -This is a forum where Linux Client users can help each other out and -discuss the latest updates. diff --git a/indra/newview/linux_tools/launch_url.sh b/indra/newview/linux_tools/launch_url.sh deleted file mode 100755 index 404ea36f26..0000000000 --- a/indra/newview/linux_tools/launch_url.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -# This script loads a web page in the 'default' graphical web browser. -# It MUST return immediately (or soon), so the browser should be -# launched in the background (thus no text-only browsers). -# This script does not trust the URL to be well-escaped or shell-safe. -# -# On Unixoids we try, in order of decreasing priority: -# - $BROWSER if set (preferred) -# - Default GNOME browser -# - Default KDE browser -# - x-www-browser -# - The first browser in $BROWSER_COMMANDS that is found. - -URL="$1" - -if [ -z "$URL" ]; then - echo "Usage: $(basename "$0") URL" - exit -fi - -# restore LD_LIBRARY_PATH from SAVED_LD_LIBRARY_PATH if it exists -if [ "${SAVED_LD_LIBRARY_PATH+isset}" = "isset" ]; then - export LD_LIBRARY_PATH="${SAVED_LD_LIBRARY_PATH}" - echo "$0: Restored library path to '${SAVED_LD_LIBRARY_PATH}'" -fi - -# if $BROWSER is defined, use it. -XBROWSER=`echo "$BROWSER" |cut -f1 -d:` -if [ ! -z "$XBROWSER" ]; then - XBROWSER_CMD=`echo "$XBROWSER" |cut -f1 -d' '` - # look for $XBROWSER_CMD either literally or in PATH - if [ -x "$XBROWSER_CMD" ] || which $XBROWSER_CMD >/dev/null; then - # check for %s string, avoiding bash2-ism of [[ ]] - if echo "$XBROWSER" | grep %s >/dev/null; then - # $XBROWSER has %s which needs substituting - echo "$URL" | xargs -r -i%s $XBROWSER & - exit - fi - # $XBROWSER has no %s, tack URL on the end instead - $XBROWSER "$URL" & - exit - fi - echo "$0: Couldn't find the browser specified by \$BROWSER ($BROWSER)" - echo "$0: Trying some others..." -fi - -# Launcher the default GNOME browser. -if [ ! -z "$GNOME_DESKTOP_SESSION_ID" ] && which gnome-open >/dev/null; then - gnome-open "$URL" & - exit -fi - -# Launch the default KDE browser. -if [ ! -z "$KDE_FULL_SESSION" ] && which kfmclient >/dev/null; then - kfmclient openURL "$URL" & - exit -fi - -# List of browser commands that will be tried in the order listed. x-www-browser -# will be tried first, which is a debian alternative. -BROWSER_COMMANDS=" \ - x-www-browser \ - firefox \ - mozilla-firefox \ - iceweasel \ - iceape \ - opera \ - epiphany-browser \ - epiphany-gecko \ - epiphany-webkit \ - epiphany \ - mozilla \ - seamonkey \ - galeon \ - dillo \ - netscape" -for browser_cmd in $BROWSER_COMMANDS; do - if which $browser_cmd >/dev/null; then - $browser_cmd "$URL" & - exit - fi -done - -echo '$0: Failed to find a known browser. Please consider setting the $BROWSER environment variable.' -exit 1 diff --git a/indra/newview/linux_tools/refresh_desktop_app_entry.sh b/indra/newview/linux_tools/refresh_desktop_app_entry.sh index d2b2a732d5..84af7505ea 100755 --- a/indra/newview/linux_tools/refresh_desktop_app_entry.sh +++ b/indra/newview/linux_tools/refresh_desktop_app_entry.sh @@ -3,7 +3,7 @@ SCRIPTSRC=`readlink -f "$0" || echo "$0"` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` -install_prefix=${RUN_PATH}/.. +install_prefix="$(realpath -- "${RUN_PATH}/..")" function install_desktop_entry() { @@ -13,18 +13,25 @@ function install_desktop_entry() local desktop_entry="\ [Desktop Entry]\n\ Name=Second Life\n\ +GenericName=Second Life Viewer\n\ Comment=Client for the On-line Virtual World, Second Life\n\ +Path=${installation_prefix}\n\ Exec=${installation_prefix}/secondlife\n\ Icon=${installation_prefix}/secondlife_icon.png\n\ Terminal=false\n\ Type=Application\n\ -Categories=Application;Network;\n\ +Categories=Game;Simulation;\n\ StartupNotify=true\n\ +StartupWMClass="com.secondlife.indra.viewer"\n\ X-Desktop-File-Install-Version=3.0" echo " - Installing menu entries in ${desktop_entries_dir}" - mkdir -vp "${desktop_entries_dir}" - echo -e $desktop_entry > "${desktop_entries_dir}/secondlife-viewer.desktop" || "Failed to install application menu!" + WORK_DIR=`mktemp -d` + echo -e $desktop_entry > "${WORK_DIR}/secondlife-viewer.desktop" || "Failed to install application menu!" + desktop-file-install --dir="${desktop_entries_dir}" ${WORK_DIR}/secondlife-viewer.desktop + rm -r $WORK_DIR + + update-desktop-database "${desktop_entries_dir}" } if [ "$UID" == "0" ]; then diff --git a/indra/newview/linux_tools/register_secondlifeprotocol.sh b/indra/newview/linux_tools/register_secondlifeprotocol.sh index 33c34d7a76..d41e6dd6cb 100755 --- a/indra/newview/linux_tools/register_secondlifeprotocol.sh +++ b/indra/newview/linux_tools/register_secondlifeprotocol.sh @@ -6,43 +6,52 @@ HANDLER="$1" -RUN_PATH=`dirname "$0" || echo .` +SCRIPTSRC=`readlink -f "$0" || echo "$0"` +RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` + +install_prefix="$(realpath -- "${RUN_PATH}/..")" + cd "${RUN_PATH}/.." if [ -z "$HANDLER" ]; then - HANDLER=`pwd`/etc/handle_secondlifeprotocol.sh + HANDLER=$install_prefix/etc/handle_secondlifeprotocol.sh fi -# Register handler for GNOME-aware apps -LLGCONFTOOL2=gconftool-2 -if which ${LLGCONFTOOL2} >/dev/null; then - (${LLGCONFTOOL2} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL2} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} failed. -else - echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} not found. -fi +function install_desktop_entry() +{ + local installation_prefix="$1" + local desktop_entries_dir="$2" + + local desktop_entry="\ +[Desktop Entry]\n\ +Name=Second Life SLURL handler\n\ +Path=${installation_prefix}\n\ +Exec=${HANDLER} %u\n\ +Icon=${installation_prefix}/secondlife_icon.png\n\ +Terminal=false\n\ +Type=Application\n\ +StartupNotify=true\n\ +StartupWMClass="com.secondlife.indra.viewer"\n\ +NoDisplay=true\n\ +MimeType=x-scheme-handler/secondlife\n\ +X-Desktop-File-Install-Version=3.0" -# Register handler for KDE-aware apps -for LLKDECONFIG in kde-config kde4-config; do - if [ `which $LLKDECONFIG` ]; then - LLKDEPROTODIR=`$LLKDECONFIG --path services | cut -d ':' -f 1` - if [ -d "$LLKDEPROTODIR" ]; then - LLKDEPROTOFILE=${LLKDEPROTODIR}/secondlife.protocol - cat > ${LLKDEPROTOFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTOFILE} -[Protocol] -exec=${HANDLER} '%u' -protocol=secondlife -input=none -output=none -helper=true -listing= -reading=false -writing=false -makedir=false -deleting=false -EOF - else - echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTODIR does not exist. - fi - fi -done + echo " - Installing protocol entries in ${desktop_entries_dir}" + WORK_DIR=`mktemp -d` + PROTOCOL_HANDLER="secondlife-protocol.desktop" + echo -e $desktop_entry > "${WORK_DIR}/${PROTOCOL_HANDLER}" || "Failed to create desktop file!" + desktop-file-install --dir="${desktop_entries_dir}" "${WORK_DIR}/${PROTOCOL_HANDLER}" || "Failed to install desktop file!" + rm -r $WORK_DIR + xdg-mime default "${desktop_entries_dir}/${PROTOCOL_HANDLER}" x-scheme-handler/secondlife + + update-desktop-database "${desktop_entries_dir}" +} + +if [ "$UID" == "0" ]; then + # system-wide + install_desktop_entry "$install_prefix" /usr/local/share/applications +else + # user-specific + install_desktop_entry "$install_prefix" "$HOME/.local/share/applications" +fi diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 3019e844d2..7e7a9a5e49 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -1,35 +1,12 @@ #!/bin/bash -## Here are some configuration options for Linux Client Testers. -## These options are for self-assisted troubleshooting during this beta -## testing phase; you should not usually need to touch them. +## Here are some configuration options for Linux Client Users. ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=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 -## and hardware. -## NOTE: This is now disabled by default. -#export LL_GL_BASICEXT=x - -## - Avoids *all* optional OpenGL extensions. This is the safest and least- -## exciting option. Enable this if you experience stability issues, and -## report whether it helps in the Linux Client Testers forum. -#export LL_GL_NOEXT=x - -## - For advanced troubleshooters, this lets you disable specific GL -## extensions, each of which is represented by a letter a-o. If you can -## narrow down a stability problem on your system to just one or two -## extensions then please post details of your hardware (and drivers) to -## the Linux Client Testers forum along with the minimal -## LL_GL_BLACKLIST which solves your problems. -#export LL_GL_BLACKLIST=abcdefghijklmno - -if [ "`uname -m`" = "x86_64" ]; then - echo '64-bit Linux detected.' -fi +## GL Driver Options +export mesa_glthread=true ## Everything below this line is just for advanced troubleshooters. ##------------------------------------------------------------------- @@ -41,15 +18,8 @@ fi ## an unstripped binary before you run. #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' - -## - The 'scim' GTK IM module widely crashes the viewer. Avoid it. -if [ "$GTK_IM_MODULE" = "scim" ]; then - export GTK_IM_MODULE=xim -fi -if [ "$XMODIFIERS" = "" ]; then - ## IME is valid only for fcitx, not when using ibus - export XMODIFIERS="@im=fcitx" -fi +#export ASAN_OPTIONS="halt_on_error=0 detect_leaks=1 symbolize=1" +#export UBSAN_OPTIONS="print_stacktrace=1 print_summary=1 halt_on_error=0" ## Nothing worth editing below this line. ##------------------------------------------------------------------- @@ -68,6 +38,8 @@ cd "${RUN_PATH}" ## Before we mess with LD_LIBRARY_PATH, save the old one to restore for ## subprocesses that care. export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" + +# Add our library directory export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}" # Copy "$@" to ARGS array specifically to delete the --skip-gridargs switch. @@ -92,10 +64,3 @@ if [ $LL_RUN_ERR -ne 0 ]; then # generic error running the binary echo '*** Bad shutdown ($LL_RUN_ERR). ***' fi - -echo -echo '*******************************************************' -echo 'This is a BETA release of the Second Life linux client.' -echo 'Thank you for testing!' -echo 'Please see README-linux.txt before reporting problems.' -echo diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 75a9ef58fc..a521170c61 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -44,6 +44,7 @@ #include "llchicletbar.h" #include "llconsole.h" #include "lldonotdisturbnotificationstorage.h" +#include "llenvironment.h" #include "llfirstuse.h" #include "llfloatercamera.h" #include "llfloaterimcontainer.h" @@ -1565,6 +1566,8 @@ void LLAgent::setAFK() setControlFlags(AGENT_CONTROL_AWAY | AGENT_CONTROL_STOP); gAwayTimer.start(); } + + LLAppViewer::instance()->setPermitOSHibernation(true); } //----------------------------------------------------------------------------- @@ -1583,6 +1586,13 @@ void LLAgent::clearAFK() sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP); clearControlFlags(AGENT_CONTROL_AWAY); } + + if (isAgentAvatarValid()) + { + // Only set this if agent is inworld, login screen + // shouldn't prevent hibernation. + LLAppViewer::instance()->setPermitOSHibernation(false); + } } //----------------------------------------------------------------------------- @@ -2697,17 +2707,20 @@ void LLAgent::onAnimStop(const LLUUID& id) else if (id == ANIM_AGENT_PRE_JUMP || id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND) { // FIRE-34049/FIRE-34273/https://github.com/secondlife/viewer/issues/4218 - // Avoid forcing AGENT_CONTROL_FINISH_ANIM, which can short-circuit the next pre-jump - // during rapid successive jumps. + // Avoid forcing AGENT_CONTROL_FINISH_ANIM on landing, which can short-circuit the + // next pre-jump during rapid successive jumps. + // Do not suppress pre-jump finish, otherwise a quick tap from standing can stall. // TODO: a more robust fix would require knowing which specific animation finished, // information that is not currently provided by the simulator. + const bool is_landing_anim = (id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND); const bool up_pos = (mControlFlags & AGENT_CONTROL_UP_POS) != 0; const F64 now = LLTimer::getTotalSeconds(); const F64 elapsed = now - mLastJumpInputTime; - static LLCachedControl<F32> recent_jump_threshold_secs(gSavedSettings, "RecentJumpThresholdSecs"); + static LLCachedControl<F32> recent_jump_threshold_secs(gSavedSettings, "RecentJumpThresholdSecs", 1.0); const bool recent_jump = (mLastJumpInputTime > 0.0) && (elapsed < recent_jump_threshold_secs); + const bool suppress_finish = is_landing_anim && recent_jump; - if (!up_pos && !recent_jump) + if (!up_pos && !suppress_finish) { setControlFlags(AGENT_CONTROL_FINISH_ANIM); } @@ -4166,6 +4179,7 @@ void LLAgent::handleTeleportFinished() } clearTeleportRequest(); mTeleportCanceled.reset(); + LLVOAvatar::resetEarlyAppearanceList(); if (mIsMaturityRatingChangingDuringTeleport) { // notify user that the maturity preference has been changed @@ -4197,6 +4211,11 @@ void LLAgent::handleTeleportFinished() mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::onCapabilitiesReceivedAfterTeleport)); } } + static LLCachedControl<bool> shared_env_on_teleport(gSavedSettings, "SwitchToSharedEnvAfterTeleport", true); + if (shared_env_on_teleport) + { + LLEnvironment::instance().setSharedEnvironment(); + } LLPerfStats::tunables.autoTuneTimeout = true; } diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 5801ba1eb8..7163f9510f 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -547,14 +547,23 @@ const S32 LLAgentWearables::getWearableIdxFromItem(const LLViewerInventoryItem* U32 wearable_count = getWearableCount(type); if (0 == wearable_count) return -1; - const LLUUID& asset_id = item->getAssetUUID(); + // Match by linked inventory item id so the correct copy is found when several + // worn wearables of this type share the same asset. + const LLUUID item_id = gInventory.getLinkedItemID(item->getUUID()); + for (U32 i = 0; i < wearable_count; ++i) + { + const LLViewerWearable* wearable = getViewerWearable(type, i); + if (!wearable) continue; + if (wearable->getItemID() == item_id) return i; + } + // Fall back to asset id for items whose inventory id can't be resolved. + 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; + if (wearable->getAssetID() == asset_id) return i; } return -1; @@ -1529,6 +1538,37 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos return false; } +bool LLAgentWearables::moveWearableToIndex(const LLViewerInventoryItem* item, U32 new_index) +{ + if (!item) return false; + if (!item->isWearableType()) return false; + + LLWearableType::EType type = item->getWearableType(); + U32 wearable_count = getWearableCount(type); + if (wearable_count < 2) return false; + + if (new_index >= wearable_count) new_index = wearable_count - 1; + + S32 cur = getWearableIdxFromItem(item); + if (cur < 0) return false; + if ((U32)cur == new_index) return true; // already in place + + // step the wearable to its new slot one swap at a time + U32 pos = (U32)cur; + while (pos < new_index) + { + if (!swapWearables(type, pos, pos + 1)) return false; + ++pos; + } + while (pos > new_index) + { + if (!swapWearables(type, pos, pos - 1)) return false; + --pos; + } + + return true; +} + // static void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, const LLUUID& parent_id, std::function<void(const LLUUID&)> created_cb) { diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 70da86805c..3c9ffa7443 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -129,6 +129,7 @@ public: static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null, std::function<void(const LLUUID&)> created_cb = nullptr); static void editWearable(const LLUUID& item_id); bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body); + bool moveWearableToIndex(const LLViewerInventoryItem* item, U32 new_index); void requestEditingWearable(const LLUUID& item_id); void editWearableIfRequested(const LLUUID& item_id); diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index f67f2688a1..f0b7457fa2 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -1039,6 +1039,19 @@ AISUpdate::AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& mFetchDepth = request_body["depth"].asInteger(); } + // Some tasks are time sensitive, don't wait for them. + // Like FETCHCOF which happens on load and is needed for outfit + // loading. + // FETCHCATEGORYLINKS is used for wearing outfits and fetching + // a user selected outfit or for following an outfit link in COF. + // Other tasks, like FETCHCATEGORYSUBSET are general background + // fetches and can safely wait. + // Do count 'time sensitive' tasks in batch timer. + mUseTimeout = + type != AISAPI::UPDATECATEGORY + && type != AISAPI::UPDATEITEM + && type != AISAPI::FETCHCOF + && type != AISAPI::FETCHCATEGORYLINKS; mTaskTimer.setTimerExpirySec(AIS_TASK_EXPIRY_SECONDS); mTaskTimer.start(); @@ -1069,6 +1082,11 @@ void AISUpdate::clearParseResults() void AISUpdate::checkTimeout() { + if (!mUseTimeout) + { + // Priority task, don't wait. + return; + } if (mTaskTimer.hasExpired() || sBatchTimer.hasExpired()) { // If we are taking too long, don't starve other tasks, @@ -1758,35 +1776,41 @@ void AISUpdate::doUpdate() const LLUUID id = ucv_it->first; S32 version = static_cast<S32>(ucv_it->second); LLViewerInventoryCategory *cat = gInventory.getCategory(id); - LL_DEBUGS("Inventory") << "cat version update " << cat->getName() << " to version " << cat->getVersion() << LL_ENDL; - if (cat->getVersion() != version) + // Update can be rather large and take time to process. + // By the time update gets to the category, it could + // could have been removed by the user + if (cat) { - // the AIS version should be considered the true version. Adjust - // our local category model to reflect this version number. Otherwise - // it becomes possible to get stuck with the viewer being out of - // sync with the inventory system. Under normal circumstances - // inventory COF is maintained on the viewer through calls to - // LLInventoryModel::accountForUpdate when a changing operation - // is performed. This occasionally gets out of sync however. - if (version != LLViewerInventoryCategory::VERSION_UNKNOWN) - { - LL_WARNS() << "Possible version mismatch for category " << cat->getName() - << ", viewer version " << cat->getVersion() - << " AIS version " << version << " !!!Adjusting local version!!!" << LL_ENDL; - cat->setVersion(version); - } - else + LL_DEBUGS("Inventory") << "cat " << cat->getName() << " version update from " << cat->getVersion() << " to AIS version " << version << LL_ENDL; + if (cat->getVersion() != version) { - // We do not account for update if version is UNKNOWN, so we shouldn't rise version - // either or viewer will get stuck on descendants count -1, try to refetch folder instead - // - // Todo: proper backoff? + // the AIS version should be considered the true version. Adjust + // our local category model to reflect this version number. Otherwise + // it becomes possible to get stuck with the viewer being out of + // sync with the inventory system. Under normal circumstances + // inventory COF is maintained on the viewer through calls to + // LLInventoryModel::accountForUpdate when a changing operation + // is performed. This occasionally gets out of sync however. + if (version != LLViewerInventoryCategory::VERSION_UNKNOWN) + { + LL_WARNS() << "Possible version mismatch for category " << cat->getName() + << ", viewer version " << cat->getVersion() + << " AIS version " << version << " !!!Adjusting local version!!!" << LL_ENDL; + cat->setVersion(version); + } + else + { + // We do not account for update if version is UNKNOWN, so we shouldn't riase version + // either or viewer will get stuck on descendants count -1, try to refetch folder instead + // + // Todo: proper backoff? - LL_WARNS() << "Possible version mismatch for category " << cat->getName() - << ", viewer version " << cat->getVersion() - << " AIS version " << version << " !!!Rerequesting category!!!" << LL_ENDL; - const S32 LONG_EXPIRY = 360; - cat->fetch(LONG_EXPIRY); + LL_WARNS() << "Possible version mismatch for category " << cat->getName() + << ", viewer version " << cat->getVersion() + << " AIS version " << version << " !!!Rerequesting category!!!" << LL_ENDL; + const S32 LONG_EXPIRY = 360; + cat->fetch(LONG_EXPIRY); + } } } } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 1dab0dd1f9..b31768d426 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -109,6 +109,7 @@ private: class AISUpdate { + LOG_CLASS(AISUpdate); public: AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body); void parseUpdate(const LLSD& update); @@ -158,6 +159,7 @@ private: uuid_list_t mCategoryIds; bool mFetch; S32 mFetchDepth; + bool mUseTimeout; LLTimer mTaskTimer; static LLTimer sBatchTimer; static U32 sBatchFrameCount; diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index d3aac5a43e..017d5c80f3 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -26,7 +26,7 @@ #import "llappdelegate-objc.h" #if defined(LL_BUGSPLAT) -#include <boost/filesystem.hpp> +#include <filesystem> #include <vector> @import CrashReporter; @import HockeySDK; @@ -39,6 +39,8 @@ #include "llappviewermacosx-for-objc.h" #include <Carbon/Carbon.h> // Used for Text Input Services ("Safe" API - it's supported) +#include "llversioninfovars.h" + @implementation LLAppDelegate @synthesize window; @@ -250,7 +252,7 @@ if(!secondLogPath.empty()) { - boost::filesystem::remove(secondLogPath); + std::filesystem::remove(secondLogPath); } clearDumpLogsDir(); } @@ -324,7 +326,7 @@ struct AttachmentInfo { AttachmentInfo(const std::string& path, const std::string& type): pathname(path), - basename(boost::filesystem::path(path).filename().string()), + basename(std::filesystem::path(path).filename().string()), mimetype(type) {} @@ -359,7 +361,7 @@ struct AttachmentInfo // the log data to a browser, so take this opportunity to rename the file // from <base>.crash to <base>_log.txt info[0].basename = - boost::filesystem::path(info[0].pathname).stem().string() + "_log.txt"; + std::filesystem::path(info[0].pathname).stem().string() + "_log.txt"; infos("attachmentsForBugsplatStartupManager attaching log " + info[0].basename); NSMutableArray *attachments = [[NSMutableArray alloc] init]; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 9636db21c1..2c53a6c433 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -980,7 +980,9 @@ void recovered_item_link_cb(const LLUUID& item_id, LLWearableType::EType type, L if (!holder->isMostRecent()) { LL_WARNS() << "HP " << holder->index() << " skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << LL_ENDL; - // runway skip here? + + // If we were signalled to stop then we shouldn't do anything else except poll for when it's safe to delete ourselves + return; } LL_INFOS("Avatar") << "HP " << holder->index() << " recovered item link for type " << type << LL_ENDL; @@ -1020,7 +1022,6 @@ void recovered_item_cb(const LLUUID& item_id, LLWearableType::EType type, LLView { if (!holder->isMostRecent()) { - // runway skip here? LL_WARNS() << self_av_string() << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << LL_ENDL; // If we were signalled to stop then we shouldn't do anything else except poll for when it's safe to delete ourselves @@ -4270,77 +4271,110 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b { if (!item || !item->isWearableType()) return false; 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 + if (closer_to_body && pos == 0) return false; // already closest to the body - U32 count = gAgentWearables.getWearableCount(item->getWearableType()); - if (count < 2) return false; // Nothing to swap with - if (closer_to_body) + return reorderWearable(item, closer_to_body ? (U32)(pos - 1) : (U32)(pos + 1)); +} + +bool LLAppearanceMgr::reorderWearable(LLViewerInventoryItem* item, U32 new_index) +{ + if (!item || !item->isWearableType()) return false; + if (item->getType() != LLAssetType::AT_CLOTHING) return false; + if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; + + LLWearableType::EType type = item->getWearableType(); + U32 count = gAgentWearables.getWearableCount(type); + if (count < 2) return false; // nothing to reorder against + + if (new_index >= count) new_index = count - 1; + + S32 cur = gAgentWearables.getWearableIdxFromItem(item); + if (cur < 0) return false; + if ((U32)cur == new_index) return false; // already in place + + // Update the live layer order first; bail before touching inventory if it fails. + if (!gAgentWearables.moveWearableToIndex(item, new_index)) return false; + + persistWearableOrder(type); + return true; +} + +bool LLAppearanceMgr::reorderWearableGroup(LLWearableType::EType type, const uuid_vec_t& ordered_link_ids) +{ + U32 count = gAgentWearables.getWearableCount(type); + if (count < 2) return false; + if (ordered_link_ids.size() != count) return false; // order must cover the whole group + + // Validate everything before mutating, so a bad link can't leave it half-reordered. + for (const LLUUID& link_id : ordered_link_ids) { - if (pos == 0) return false; // already first + LLViewerInventoryItem* link = gInventory.getItem(link_id); + if (!link || link->getWearableType() != type) return false; } - else + + // ordered_link_ids runs furthest-to-closest; body index 0 is closest to the body. + // Place each target at its body index, leaving already-placed lower indices untouched. + for (U32 body_index = 0; body_index < count; ++body_index) { - if (pos == count - 1) return false; // already last + const LLUUID& link_id = ordered_link_ids[count - 1 - body_index]; + LLViewerInventoryItem* link = gInventory.getItem(link_id); + if (!link || link->getWearableType() != type) return false; + if (!gAgentWearables.moveWearableToIndex(link, body_index)) return false; } - 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); + persistWearableOrder(type); + return true; +} + +void LLAppearanceMgr::persistWearableOrder(LLWearableType::EType type) +{ + U32 count = gAgentWearables.getWearableCount(type); - // Find link item from item id. + // Rewrite the sort-index descriptions for the whole type group in one pass so + // the order survives relog, trusting gAgentWearables over existing descriptions. LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - LLFindWearablesOfType filter_wearables_of_type(item->getWearableType()); + LLFindWearablesOfType filter_wearables_of_type(type); gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); - if (items.empty()) return false; - LLViewerInventoryItem* swap_item = nullptr; - for (auto iter : items) + for (U32 i = 0; i < count; ++i) { - if (iter->getLinkedUUID() == swap_item_id) + LLUUID linked_id = gAgentWearables.getWearableItemID(type, i); + if (linked_id.isNull()) continue; + + LLViewerInventoryItem* link = nullptr; + for (auto iter : items) { - swap_item = iter.get(); - break; + if (iter->getLinkedUUID() == linked_id) + { + link = iter.get(); + break; + } } - } - if (!swap_item) - { - return false; - } - - // 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); + if (!link) continue; - item->setComplete(true); - item->updateServer(false); - gInventory.updateItem(item); + std::string new_desc = build_order_string(type, i); + if (new_desc == link->getActualDescription()) continue; - swap_item->setComplete(true); - swap_item->updateServer(false); - gInventory.updateItem(swap_item); + // Keep the local cache consistent immediately (so the COF list does not + // flicker back on a refresh), and persist durably via AISv3, matching + // updateClothingOrderingInfo() rather than the legacy UDP updateServer(). + link->setDescription(new_desc); + LLSD updates; + updates["desc"] = new_desc; + update_inventory_item(link->getUUID(), updates, NULL); + } - //to cause appearance of the agent to be updated - bool result = false; - if ((result = gAgentWearables.moveWearable(item, closer_to_body))) + if (isAgentAvatarValid()) { - gAgentAvatarp->wearableUpdated(item->getWearableType()); + gAgentAvatarp->wearableUpdated(type); } setOutfitDirty(true); - - //*TODO do we need to notify observers here in such a way? gInventory.notifyObservers(); - - return result; } //static diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 9d90be0004..77146ba0be 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -210,6 +210,15 @@ public: bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body); + // Move a clothing item to an absolute layer index within its wearable type + // (0 == closest to the body). Persists the new order to the COF link descriptions. + bool reorderWearable(LLViewerInventoryItem* item, U32 new_index); + + // Apply a complete layer order for one wearable type, persisting it to the + // COF link descriptions. ordered_link_ids lists the type's COF link items + // furthest-to-closest. + bool reorderWearableGroup(LLWearableType::EType type, const uuid_vec_t& ordered_link_ids); + static void sortItemsByActualDescription(LLInventoryModel::item_array_t& items); //Divvy items into arrays by wearable type @@ -250,6 +259,10 @@ private: private: + // Rewrite COF sort-index descriptions for one wearable type to match the + // current in-memory layer order, then trigger a single appearance update. + void persistWearableOrder(LLWearableType::EType type); + void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type, S32 max_total, bool skip_bodyparts = false); void getDescendentsOfAssetType(const LLUUID& category, diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f0df9537fc..39a89a9373 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -66,6 +66,7 @@ #include "llconversationlog.h" #if LL_WINDOWS #include "lldxhardware.h" +#include <shellapi.h> #endif #include "lltexturestats.h" #include "lltrace.h" @@ -114,6 +115,7 @@ #include "lllocalbitmaps.h" #include "llperfstats.h" #include "llgltfmateriallist.h" +#include "llwebsocketmgr.h" // Linden library includes #include "llavatarnamecache.h" @@ -143,12 +145,12 @@ #include "vlc/libvlc_version.h" #endif -#if LL_DARWIN -#if LL_SDL -#include "llwindowsdl.h" -#else +#if LL_DARWIN && !LL_SDL_WINDOW #include "llwindowmacosx.h" -#endif // LL_SDL +#endif + +#if LL_SDL_WINDOW +#include "llwindowsdl.h" #endif // Third party library includes @@ -192,7 +194,6 @@ #include "lltracker.h" #include "llviewerparcelmgr.h" #include "llworldmapview.h" -#include "llpostprocess.h" #include "lldebugview.h" #include "llconsole.h" @@ -280,12 +281,13 @@ using namespace LL; // define a self-registering event API object #include "llappviewerlistener.h" -#if LL_MSVC -// disable boost::lexical_cast warning -#pragma warning (disable:4702) -#endif - #ifdef LL_DISCORD +#ifdef None +#undef None +#endif +#ifdef BadRequest +#undef BadRequest +#endif #define DISCORDPP_IMPLEMENTATION #include <discordpp.h> static std::shared_ptr<discordpp::Client> gDiscordClient; @@ -304,17 +306,24 @@ static LLAppViewerListener sAppViewerListener(LLAppViewer::instance); #if LL_DARWIN extern void init_apple_menu(const char* product); +extern bool gHDRDisplaySupport; #endif // LL_DARWIN extern bool gRandomizeFramerate; extern bool gPeriodicSlowFrame; extern bool gDebugGL; -#if LL_DARWIN +#if LL_DARWIN || LL_SDL_WINDOW extern bool gHiDPISupport; -extern bool gHDRDisplaySupport; #endif +#if LL_WINDOWS +extern bool gGPUBenchmarkMode; +#else +static constexpr bool gGPUBenchmarkMode = false; +#endif // LL_WINDOWS + + //////////////////////////////////////////////////////////// // All from the last globals push... @@ -399,6 +408,8 @@ 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"); const std::string WATCHDOG_MARKER_FILE_NAME("SecondLife.watchdog_marker"); +const std::string INITED_MARKER_FILE_NAME("SecondLife.inited_marker"); +const std::string CLOSE_EVENT_MARKER_FILE_NAME("SecondLife.close_marker"); static std::string gLaunchFileOnQuit; //---------------------------------------------------------------------------- @@ -559,15 +570,13 @@ static void settings_to_globals() { LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize")); -//#if LL_DARWIN +#if LL_DARWIN LLRender::sGLCoreProfile = true; -/* #else LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLContextCoreProfile"); #endif -*/ LLRender::sNsightDebugSupport = gSavedSettings.getBOOL("RenderNsightDebugSupport"); - LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); + LLRender::sAnisotropicFilteringLevel = static_cast<F32>(gSavedSettings.getU32("RenderAnisotropicLevel")); LLImageGL::sCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures"); LLVOVolume::sLODFactor = llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR); LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; @@ -592,14 +601,17 @@ static void settings_to_globals() LLWorldMapView::setScaleSetting(gSavedSettings.getF32("MapScale")); #if LL_DARWIN -#if LL_SDL +#if LL_SDL_WINDOW LLWindowSDL::sUseMultGL = gSavedSettings.getBOOL("RenderAppleUseMultGL"); #else LLWindowMacOSX::sUseMultGL = gSavedSettings.getBOOL("RenderAppleUseMultGL"); -#endif // LL_SDL - gHiDPISupport = gSavedSettings.getBOOL("RenderHiDPI"); +#endif gHDRDisplaySupport = gSavedSettings.getBOOL("MPHDRDisplay"); #endif + +#if LL_DARWIN || LL_SDL_WINDOW + gHiDPISupport = gSavedSettings.getBOOL("RenderHiDPI"); +#endif } static void settings_modify() @@ -655,6 +667,12 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url) return false; } +//virtual +void LLAppViewer::setOSHibernationMode(eHibernationMode mode) +{ + // See OS specific files +} + //---------------------------------------------------------------------------- // LLAppViewer definition @@ -713,6 +731,12 @@ LLAppViewer::LLAppViewer() gLoggedInTime.stop(); + // Locking this early is needed to prevent multiple instances and + // to log, but it also means that early paths such as SLURL handling + // can invoke processMarkerFiles() and potentially clear markers + // from previous runs before those stats are reported. + // Todo: improve this. Perhaps store stats 'permanently' to be reported + // on next login and only login cleans stats up? processMarkerFiles(); // // OK to write stuff to logs now, we've now crash reported if necessary @@ -865,6 +889,8 @@ bool LLAppViewer::init() // that use findSkinnedFilenames(), will include the localized files. gDirUtilp->setSkinFolder(gDirUtilp->getSkinFolder(), LLUI::getLanguage()); + loadLocalizedSettingsComments(); + // Setup LLTrans after LLUI::initClass has been called. initStrings(); @@ -963,6 +989,16 @@ bool LLAppViewer::init() LL_WARNS("InitInfo") << "initHardwareTest() failed." << LL_ENDL; // quit immediately LL_PROFILER_FRAME_END; + LLSingletonBase::deleteAll(); + cleanupConsole(); + delete mSettingsLocationList; + if (!mSecondInstance) + { + // Stats from previous session will likely be lost, but this should + // be fine as this is likely first run for this version. + // Todo: Might be smarter to have an exit code for a cleaner shutdown + removeMarkerFiles(); + } return false; } LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ; @@ -1022,7 +1058,7 @@ bool LLAppViewer::init() return false; } -#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || _M_X64 +#if defined(LL_X86) || defined(LL_X86_64) // Without SSE2 support we will crash almost immediately, warn here. if (!gSysCPU.hasSSE2()) { @@ -1143,17 +1179,17 @@ bool LLAppViewer::init() gGLActive = false; -//#if LL_RELEASE_FOR_DOWNLOAD - // Launch VVM update check +#if 0 + // Launch VVM update check (Linux updater is future work: Velopack port) if (!gSavedSettings.getBOOL("CmdLineSkipUpdater") && !gNonInteractive) { initVVMUpdateCheck(); } else +#endif { LL_WARNS("InitInfo") << "Skipping updater check." << LL_ENDL; } -//#endif //LL_RELEASE_FOR_DOWNLOAD { // Iterate over --leap command-line options. But this is a bit tricky: if @@ -1271,15 +1307,11 @@ 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 + #if !defined(LL_X86_64) && !defined(LL_ARM64) 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); } @@ -1790,7 +1822,15 @@ bool LLAppViewer::cleanup() // Give any remaining SLPlugin instances a chance to exit cleanly. LLPluginProcessParent::shutdown(); + if (LLWatchdog::instanceExists()) + { + // Signal a stop early, so that it will be out + // of 1s sleep loop by the time we get to clean it. + LLWatchdog::getInstance()->shutdown(); + } + disconnectViewer(); + LLViewerCamera::deleteSingleton(); LL_INFOS() << "Viewer disconnected" << LL_ENDL; @@ -1901,6 +1941,9 @@ bool LLAppViewer::cleanup() if( gViewerWindow) gViewerWindow->shutdownViews(); + // Model previews release their decomposition handles while the UI is destroyed. + gMeshRepo.shutdownDecomposition(); + LL_INFOS() << "Cleaning up Inventory" << LL_ENDL; // Cleanup Inventory after the UI since it will delete any remaining observers @@ -1921,8 +1964,6 @@ bool LLAppViewer::cleanup() SUBSYSTEM_CLEANUP(LLAvatarAppearance); - SUBSYSTEM_CLEANUP(LLPostProcess); - LLTracker::cleanupInstance(); // *FIX: This is handled in LLAppViewerWin32::cleanup(). @@ -2091,7 +2132,7 @@ bool LLAppViewer::cleanup() } LLSplashScreen::show(); - LLSplashScreen::update(LLTrans::getString("ShuttingDown")); + LLSplashScreen::update(LLTrans::getString("ShutdownCleanup")); LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL; @@ -2120,7 +2161,7 @@ bool LLAppViewer::cleanup() if (sTextureFetch) { sTextureFetch->shutdown(); - sTextureFetch->waitOnPending(); + sTextureFetch->waitOnPending(10.f); delete sTextureFetch; sTextureFetch = NULL; } @@ -2165,7 +2206,10 @@ bool LLAppViewer::cleanup() gSavedSettings.cleanup(); LLUIColorTable::instance().clear(); - LLWatchdog::getInstance()->cleanup(); + if (LLWatchdog::instanceExists()) + { + LLWatchdog::getInstance()->cleanup(); + } LLViewerAssetStatsFF::cleanup(); @@ -2190,6 +2234,10 @@ bool LLAppViewer::cleanup() SUBSYSTEM_CLEANUP(LLProxy); LLCore::LLHttp::cleanup(); + LLSplashScreen::update(LLTrans::getString("CompressingInventoryCache")); + LLInventoryModel::waitForPendingCacheWrites(); + LLSplashScreen::update(LLTrans::getString("ShuttingDown")); + ll_close_fail_log(); LLError::LLCallStacks::cleanup(); @@ -2201,6 +2249,8 @@ bool LLAppViewer::cleanup() LLWorld::deleteSingleton(); LLVoiceClient::deleteSingleton(); LLUI::deleteSingleton(); + LLGridManager::deleteSingleton(); + LLWatchdog::deleteSingleton(); // It's not at first obvious where, in this long sequence, a generic cleanup // call OUGHT to go. So let's say this: as we migrate cleanup from @@ -2317,7 +2367,7 @@ void errorCallback(LLError::ELevel level, const std::string &error_string) LLAppViewer::instance()->writeDebugInfo(); std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); - if (!LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB)) + if (!LLFile::isfile(error_marker_file)) { // If marker doesn't exist, create a marker with llerror code for next launch // otherwise don't override existing file @@ -2345,6 +2395,9 @@ void errorHandler(const std::string& title_string, const std::string& message_st case LLError::LLUserWarningMsg::ERROR_MISSING_FILES: LLAppViewer::instance()->createErrorMarker(LAST_EXEC_MISSING_FILES); break; + case LLError::LLUserWarningMsg::ERROR_INIT_FAILED: + LLAppViewer::instance()->createErrorMarker(LAST_EXEC_INIT); + break; default: break; } @@ -2369,6 +2422,12 @@ void errorHandler(const std::string& title_string, const std::string& message_st } } +namespace +{ + std::string getStartupLogFileName(); + std::string getOldLogFileName(const std::string& log_file); +} + void LLAppViewer::initLoggingAndGetLastDuration() { // @@ -2385,22 +2444,25 @@ void LLAppViewer::initLoggingAndGetLastDuration() if (mSecondInstance) { - LLFile::mkdir(gDirUtilp->getDumpLogsDirPath()); + if (!gGPUBenchmarkMode) + { + LLFile::mkdir(gDirUtilp->getDumpLogsDirPath()); - LLUUID uid; - uid.generate(); - LLError::logToFile(gDirUtilp->getDumpLogsDirPath(uid.asString() + ".log")); + LLUUID uid; + uid.generate(); + // Is this even useful? + // Originally this wa used to store states, but I don't think it's practical with bugsplat attributes. + // So it just spams files now. + LLError::logToFile(gDirUtilp->getDumpLogsDirPath(uid.asString() + ".log")); + } } else { // Remove the last ".old" log file. - std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "SecondLife.old"); + std::string log_file = getStartupLogFileName(); + std::string old_log_file = getOldLogFileName(log_file); LLFile::remove(old_log_file); - // Get name of the log file - std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "SecondLife.log"); /* * Before touching any log files, compute the duration of the last run * by comparing the ctime of the previous start marker file with the ctime @@ -2447,7 +2509,7 @@ void LLAppViewer::initLoggingAndGetLastDuration() // Rename current log file to ".old" LLFile::rename(log_file, old_log_file); - // Set the log file to SecondLife.log + // Set the log file. LLError::logToFile(log_file); LL_INFOS() << "Started logging to " << log_file << LL_ENDL; if (!duration_log_msg.empty()) @@ -2586,6 +2648,76 @@ namespace LLStringUtil::null, OSMB_OK); } + + std::string getStartupLogFileName() + { + if (LLControlVariable* user_log_file = gSavedSettings.getControl("UserLogFile")) + { + std::string log_file = user_log_file->getValue().asString(); + if (!log_file.empty()) + { + return log_file; + } + } + +#if LL_WINDOWS + int argc = 0; + LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); + if (argv) + { + std::string log_file; + for (int i = 1; i < argc; ++i) + { + std::string option = ll_convert_wide_to_string(argv[i]); + if ((option == "--logfile" || option == "-logfile" || option == "/logfile") && + i + 1 < argc) + { + log_file = ll_convert_wide_to_string(argv[i + 1]); + } + else if (option.compare(0, 10, "--logfile=") == 0) + { + log_file = option.substr(10); + } + else if (option.compare(0, 9, "-logfile=") == 0) + { + log_file = option.substr(9); + } + else if (option.compare(0, 9, "/logfile:") == 0) + { + log_file = option.substr(9); + } + } + LocalFree(argv); + + if (!log_file.empty()) + { + return log_file; + } + } +#endif + + return gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log"); + } + + std::string getOldLogFileName(const std::string& log_file) + { + std::string old_log_file = log_file; + size_t separator = old_log_file.find_last_of("/\\"); + size_t basename_start = (separator == std::string::npos) ? 0 : separator + 1; + size_t extension = old_log_file.find_last_of('.'); + + if (extension != std::string::npos && + extension > basename_start) + { + old_log_file.replace(extension, std::string::npos, ".old"); + } + else + { + old_log_file += ".old"; + } + + return old_log_file; + } } // anonymous namespace // Set a named control temporarily for this session, as when set via the command line --set option. @@ -2958,6 +3090,8 @@ bool LLAppViewer::initConfiguration() } } + LLGridManager::createInstance(); + LLSLURL start_slurl; if (!starting_location.empty()) { @@ -3000,19 +3134,39 @@ bool LLAppViewer::initConfiguration() { if (sendURLToOtherInstance(start_slurl.getSLURLString())) { - // successfully handed off URL to existing instance, exit + // Successfully handed off URL to existing instance. + // Returning 'false' gets treated as a failure to init, + // without cleanup, so instead clear markers and app here. + // Do not save settings. + // Might be smarter to have an exit code for a more reliable + // "early exit, needs cleanup" case. + LLGridManager::deleteSingleton(); + LLSingletonBase::deleteAll(); + cleanupConsole(); + delete mSettingsLocationList; + if (!mSecondInstance) + { + // Todo: Unfortunately, if we are doing this, stats and + // markers from previous session were already processed, + // cleared yet haven't been reported and will be lost. + // Consider a way to save those. + removeMarkerFiles(); + } return false; } } // Display splash screen. Must be after above check for previous // crash as this dialog is always frontmost. - std::string splash_msg; - LLStringUtil::format_map_t args; - args["[APP_NAME]"] = LLTrans::getString("SECOND_LIFE"); - splash_msg = LLTrans::getString("StartupLoading", args); - LLSplashScreen::show(); - LLSplashScreen::update(splash_msg); + if (!gGPUBenchmarkMode) + { + std::string splash_msg; + LLStringUtil::format_map_t args; + args["[APP_NAME]"] = LLTrans::getString("SECOND_LIFE"); + splash_msg = LLTrans::getString("StartupLoading", args); + LLSplashScreen::show(); + LLSplashScreen::update(splash_msg); + } //LLVolumeMgr::initClass(); LLVolumeMgr* volume_manager = new LLVolumeMgr(); @@ -3047,6 +3201,12 @@ bool LLAppViewer::initConfiguration() LLTrans::getString("MBAlreadyRunning"), LLStringUtil::null, OSMB_OK); + + // Since returning 'false' is basically an error without cleanup, + // do cleanup here. No need to worry about marker files here. + LLGridManager::deleteSingleton(); + LLSingletonBase::deleteAll(); + cleanupConsole(); return false; } @@ -3087,6 +3247,57 @@ bool LLAppViewer::initConfiguration() return true; // Config was successful. } +static void apply_localized_comments(LLControlGroup& group, const LLSD& comments) +{ + for (LLSD::map_const_iterator it = comments.beginMap(); it != comments.endMap(); ++it) + { + LLControlVariablePtr control = group.getControl(it->first); + if (control.notNull()) + { + const std::string comment = it->second.asString(); + if (!comment.empty()) + { + control->setComment(comment); + } + } + } +} + +void LLAppViewer::loadLocalizedSettingsComments() +{ + std::string lang = LLUI::getLanguage(); + if (lang.empty() || lang == "en") + { + return; + } + + std::string path = gDirUtilp->findSkinnedFilename( + LLDir::XUI, "settings_comments.xml", LLDir::CURRENT_SKIN); + if (path.empty()) + { + return; + } + + llifstream infile; + infile.open(path.c_str()); + if (!infile.is_open()) + { + return; + } + + LLSD comments; + if (LLSDParser::PARSE_FAILURE == LLSDSerialize::fromXML(comments, infile)) + { + infile.close(); + LL_WARNS("Settings") << "Failed to parse localized settings comments file: " << path << LL_ENDL; + return; + } + infile.close(); + + apply_localized_comments(gSavedSettings, comments); + apply_localized_comments(gSavedPerAccountSettings, comments); +} + // The following logic is replicated in initConfiguration() (to be able to get // some initial strings before we've finished initializing enough to know the // current language) and also in init() (to initialize for real). Somehow it @@ -3106,13 +3317,11 @@ void LLAppViewer::initStrings() } else { - llstat st; - int rc = LLFile::stat(strings_path_full, &st); - if (rc != 0) + if (!LLFile::exists(strings_path_full)) { - crash_reason = "The file '" + strings_path_full + "' failed to get status. Error code: " + std::to_string(rc); + crash_reason = "The file '" + strings_path_full + "' doesn't seem to exist"; } - else if (S_ISDIR(st.st_mode)) + else if (LLFile::isdir(strings_path_full)) { crash_reason = "The filename '" + strings_path_full + "' is a directory name"; } @@ -3502,7 +3711,7 @@ LLSD LLAppViewer::getViewerInfo() const info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance"); info["TEXTURE_MEMORY"] = LLSD::Integer(gGLManager.mVRAM); -#if LL_DARWIN +#if LL_DARWIN || LL_SDL_WINDOW info["HIDPI"] = gHiDPISupport; #endif @@ -3558,8 +3767,6 @@ LLSD LLAppViewer::getViewerInfo() const cef_ver_codec << CHROME_VERSION_PATCH; info["LIBCEF_VERSION"] = cef_ver_codec.str(); -#else - info["LIBCEF_VERSION"] = "Undefined"; #endif #if defined(LL_VLC) @@ -3570,14 +3777,13 @@ 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); + LLTrace::Recording& recording = LLViewerStats::instance().getRecording(); + S32 packets_in = (S32)recording.getSum(LLStatViewer::PACKETS_IN); if (packets_in > 0) { - info["PACKETS_LOST"] = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST); + info["PACKETS_LOST"] = recording.getSum(LLStatViewer::PACKETS_LOST); info["PACKETS_IN"] = packets_in; info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); } @@ -3630,6 +3836,13 @@ std::string LLAppViewer::getViewerInfoString(bool default_string) const { args[ii->first] = LLTrans::getString("none_text", default_string); } + else if (ii->second.isBoolean()) + { + // LLSD intentionally renders false as an empty string to + // preserve string-to-boolean round trips. Viewer info is + // human-readable, so show both boolean states explicitly. + args[ii->first] = ii->second.asBoolean() ? "true" : "false"; + } else { // don't forget to render value asString() @@ -3762,8 +3975,12 @@ void LLAppViewer::writeSystemInfo() gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily(); gDebugInfo["CPUInfo"]["CPUMhz"] = (S32)gSysCPU.getMHz(); gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec(); - gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE(); - gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2(); + gDebugInfo["CPUInfo"]["CPUSSE42"] = gSysCPU.hasSSE42(); + gDebugInfo["CPUInfo"]["CPUSSE4a"] = gSysCPU.hasSSE4a(); + gDebugInfo["CPUInfo"]["CPUAVX"] = gSysCPU.hasAVX(); + gDebugInfo["CPUInfo"]["CPUAVX2"] = gSysCPU.hasAVX2(); + gDebugInfo["CPUInfo"]["CPUAVX512F"] = gSysCPU.hasAVX512F(); + gDebugInfo["RAMInfo"]["Physical"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().value()); gDebugInfo["RAMInfo"]["Allocated"] = LLSD::Integer(gMemoryAllocated.valueInUnits<LLUnits::Kilobytes>()); @@ -4007,18 +4224,30 @@ bool LLAppViewer::getMarkerData(const std::string& marker_name, std::string& dat void LLAppViewer::processMarkerFiles() { + if (gGPUBenchmarkMode) + { + // Skipping marker file processing in GPU benchmark mode + mSecondInstance = true; + initLoggingAndGetLastDuration(); + return; + } //We've got 4 things to test for here // - Other Process Running (SecondLife.exec_marker present, locked) // - Freeze (SecondLife.exec_marker present, not locked) // - LLError Crash (SecondLife.llerror_marker present) // - Other Crash (SecondLife.error_marker present) - // These checks should also remove these files for the last 2 cases if they currently exist + // - Watchdog freeze (SecondLife.watchdog_marker present) + // - Failed to initialize (SecondLife.inited_marker not present) + // - Potentially killed by task manager or computer + // didn't recover from hibernation (SecondLife.close_marker present) + // These checks should also remove these files for the last 2 cases + // if they currently exist std::ostringstream marker_log_stream; bool marker_is_same_version = true; // first, look for the marker created at startup and deleted on a clean exit mMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,MARKER_FILE_NAME); - if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB)) + if (LLFile::isfile(mMarkerFileName)) { // File exists... // first, read it to see if it was created by the same version (we need this later) @@ -4105,7 +4334,7 @@ void LLAppViewer::processMarkerFiles() // check for any last exec event report based on whether or not it happened during logout // (the logout marker is created when logout begins) std::string logout_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LOGOUT_MARKER_FILE_NAME); - if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB)) + if(LLFile::isfile(logout_marker_file)) { if (markerIsSameVersion(logout_marker_file)) { @@ -4117,14 +4346,16 @@ void LLAppViewer::processMarkerFiles() { LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "' found, but versions did not match" << LL_ENDL; } - LLAPRFile::remove(logout_marker_file); + LLFile::remove(logout_marker_file); } // Refine based on whether or not a marker created during // a crash is found or if wathdog caught a freeze. // Bugsplat will set correct state in bugsplatSendLog. std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); std::string watchdog_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME); - if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB)) + std::string inited_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, INITED_MARKER_FILE_NAME); + std::string close_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, CLOSE_EVENT_MARKER_FILE_NAME); + if(LLFile::isfile(error_marker_file)) { S32 marker_code = getMarkerErrorCode(error_marker_file); if (marker_code >= 0) @@ -4152,8 +4383,8 @@ void LLAppViewer::processMarkerFiles() { LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; } - LLAPRFile::remove(error_marker_file); - if (LLAPRFile::isExist(watchdog_marker_file, NULL, LL_APR_RB)) + LLFile::remove(error_marker_file); + if (LLFile::isfile(watchdog_marker_file)) { // If viewer crashed after a freeze was detected, // crash still takes precendence. Just clear watchdog. @@ -4162,11 +4393,13 @@ void LLAppViewer::processMarkerFiles() } else { - // so only check watchdog marker if there is no error marker. - if (LLAPRFile::isExist(watchdog_marker_file, NULL, LL_APR_RB)) + if (LAST_EXEC_UNKNOWN == gLastExecEvent + || LAST_EXEC_LOGOUT_UNKNOWN == gLastExecEvent) { - if (LAST_EXEC_UNKNOWN == gLastExecEvent - || LAST_EXEC_LOGOUT_UNKNOWN == gLastExecEvent) + // If viewer crashed after a freeze was detected, + // crash still takes precendence. + // So only check watchdog marker if there is no error marker. + if (LLFile::isfile(watchdog_marker_file)) { // watchdog marker gets created if we detect a freeze, // so if viwer did not stop gracefully, and we know it wasn't a crash, @@ -4178,9 +4411,49 @@ void LLAppViewer::processMarkerFiles() << LL_ENDL; } } - removeWatchdogMarker(); + // If 'close' marker is found, viewer either started shutdown but + // failed, OS did not recover from hibernation or viewer got + // killed by task manager. + // Marker does not indicate that viewer was closed or is closing, + // just that 'close' was requested before viewer died. + else if (LLFile::isfile(close_marker_file)) + { + // Unfortunately we can't reliably distinguish + // task manager's case from genuine shutdown, so we + // have to report all of them as the same thing. + // Todo: but we can distinguish hibernation, might want + // to simply not report it as an issue. + if (markerIsSameVersion(close_marker_file)) + { + gLastExecEvent = LAST_EXEC_OS_EVENT; + LL_INFOS("MarkerFile") << "'Close' marker '" << close_marker_file << "' found, setting LastExecEvent to OS_EVENT" + << LL_ENDL; + } + } + else if ((LAST_EXEC_UNKNOWN == gLastExecEvent) + && !LLFile::isfile(inited_marker_file)) + { + // Viewer didn't get to a login screen. + gLastExecEvent = LAST_EXEC_INIT; + LL_INFOS("MarkerFile") << "'Inited' marker '" + << inited_marker_file + << "' not found, assuming that init crashed." + << LL_ENDL; + } } } + if (LLFile::isfile(watchdog_marker_file)) + { + removeWatchdogMarker(); + } + if (LLFile::isfile(inited_marker_file)) + { + removeInitedMarker(); + } + if (LLFile::isfile(close_marker_file)) + { + removeCloseRequestMarker(); + } #if LL_DARWIN if (!mSecondInstance && gLastExecEvent != LAST_EXEC_NORMAL) @@ -4206,7 +4479,7 @@ void LLAppViewer::removeMarkerFiles() if (mMarkerFile.getFileHandle()) { mMarkerFile.close() ; - LLAPRFile::remove( mMarkerFileName ); + LLFile::remove( mMarkerFileName ); LL_DEBUGS("MarkerFile") << "removed exec marker '"<<mMarkerFileName<<"'"<< LL_ENDL; } else @@ -4217,13 +4490,14 @@ void LLAppViewer::removeMarkerFiles() if (mLogoutMarkerFile.getFileHandle()) { mLogoutMarkerFile.close(); - LLAPRFile::remove( mLogoutMarkerFileName ); + LLFile::remove( mLogoutMarkerFileName ); LL_DEBUGS("MarkerFile") << "removed logout marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; } else { LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; } + removeCloseRequestMarker(); removeWatchdogMarker(); } else @@ -4283,6 +4557,13 @@ void LLAppViewer::requestQuit() // This prevents the halfway-logged-in avatar from hanging around inworld for a couple minutes. if (region) { + // We probably don't have caps to do it, and it might + // arrive after logout finishes, but attempt to send stats + if (region->capabilitiesReceived()) + { + constexpr bool include_preferences = true; + send_viewer_stats(include_preferences); + } sendLogoutRequest(); } @@ -4383,6 +4664,14 @@ void LLAppViewer::abortQuit() mClosingFloaters = false; } +void LLAppViewer::sendViewerStatistics(bool include_preferences) +{ + if (!gDisconnected) + { + send_viewer_stats(include_preferences); + } +} + void LLAppViewer::migrateCacheDirectory() { #if LL_WINDOWS || LL_DARWIN @@ -4444,7 +4733,7 @@ void LLAppViewer::migrateCacheDirectory() LLFile::remove(ds_store); } #endif - if (LLFile::rmdir(old_cache_dir) != 0) + if (LLFile::remove(old_cache_dir) != 0) { LL_WARNS() << "could not delete old cache directory " << old_cache_dir << LL_ENDL; } @@ -4730,7 +5019,7 @@ void LLAppViewer::purgeCacheImmediate() std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "objectcache"); LL_INFOS() << "Removing cache at " << cache_dir << LL_ENDL; gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files - LLFile::rmdir(cache_dir); + LLFile::remove(cache_dir); } } @@ -5006,6 +5295,11 @@ void LLAppViewer::idle() LLMortician::updateClass(); LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify() LLDirPickerThread::clearDead(); + + if (LLWebsocketMgr::instanceExists()) + { + LLWebsocketMgr::instance().update(); + } F32 dt_raw = idle_timer.getElapsedTimeAndResetF32(); LLGLTFMaterialList::flushUpdates(); @@ -5013,6 +5307,7 @@ void LLAppViewer::idle() static LLCachedControl<U32> downscale_method(gSavedSettings, "RenderDownScaleMethod"); gGLManager.mDownScaleMethod = downscale_method; LLImageGL::updateClass(); + LLUIImage::updateClass(); // Service the WorkQueue we use for replies from worker threads. // Use function statics for the timeslice setting so we only have to fetch @@ -5662,7 +5957,60 @@ 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); + return LLFile::isfile(error_marker_file); +} + +void LLAppViewer::createCloseRequestMarker() const +{ + // WINDOW THREAD! since we need this to act fast. + // This does not indicate that viewer was closed or is closing, + // but that 'close' was requested. + if (!mSecondInstance) + { + std::string close_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, CLOSE_EVENT_MARKER_FILE_NAME); + + LLAPRFile file; + file.open(close_marker, LL_APR_WB); + if (file.getFileHandle()) + { + recordMarkerVersion(file); + file.close(); + } + } +} + +void LLAppViewer::removeCloseRequestMarker() const +{ + if (!mSecondInstance) + { + std::string close_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, CLOSE_EVENT_MARKER_FILE_NAME); + LLFile::remove(close_marker, ENOENT); + } +} + +void LLAppViewer::createInitedMarker() const +{ + if (!mSecondInstance) + { + std::string inited_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, INITED_MARKER_FILE_NAME); + + LLAPRFile file; + file.open(inited_marker, LL_APR_WB); + if (file.getFileHandle()) + { + recordMarkerVersion(file); + file.close(); + } + } +} + +void LLAppViewer::removeInitedMarker() const +{ + if (!mSecondInstance) + { + std::string inited_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, INITED_MARKER_FILE_NAME); + LLFile::remove(inited_marker, ENOENT); + } } void LLAppViewer::createWatchdogMarker() const @@ -5680,12 +6028,13 @@ void LLAppViewer::createWatchdogMarker() const } } } + void LLAppViewer::removeWatchdogMarker() const { if (!mSecondInstance) { std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME); - LLFile::remove(error_marker_file); + LLFile::remove(error_marker_file, ENOENT); } } @@ -5707,6 +6056,29 @@ void LLAppViewer::outOfMemorySoftQuit() } } +void LLAppViewer::setPermitOSHibernation(bool permit) +{ + if (permit) + { + if (mCurrentHibernationMode != LL_HIBERNATE_MODE_DEFAULT) + { + // Will call OS specific code to let OS hibernate when idle + setOSHibernationMode(LL_HIBERNATE_MODE_DEFAULT); + mCurrentHibernationMode = LL_HIBERNATE_MODE_DEFAULT; + } + } + else + { + static LLCachedControl<S32> os_hibernation_mode(gSavedSettings, "OSHibernationMode", 0); + eHibernationMode mode = static_cast<eHibernationMode>(os_hibernation_mode()); + if (mode != LL_HIBERNATE_MODE_DEFAULT && mCurrentHibernationMode != mode) + { + setOSHibernationMode(mode); + mCurrentHibernationMode = mode; + } + } +} + void LLAppViewer::idleNameCache() { // Neither old nor new name cache can function before agent has a region @@ -5751,7 +6123,6 @@ void LLAppViewer::idleNetwork() pingMainloopTimeout("idleNetwork"); gObjectList.mNumNewObjects = 0; - S32 total_decoded = 0; static LLCachedControl<bool> speed_test(gSavedSettings, "SpeedTest", false); if (!speed_test()) @@ -5759,64 +6130,56 @@ void LLAppViewer::idleNetwork() LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("idle network"); //LL_RECORD_BLOCK_TIME(FTM_IDLE_NETWORK); // decode LLTimer check_message_timer; - // Read all available packets from network const S64 frame_count = gFrameCount; // U32->S64 - F32 total_time = 0.0f; + S32 total_decoded = 0; + // Process packets from network + LockMessageChecker lmc(gMessageSystem); + while (lmc.checkAllMessages(frame_count, gServicePump)) { - bool needs_drain = false; - LockMessageChecker lmc(gMessageSystem); - while (lmc.checkAllMessages(frame_count, 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; - } - - total_decoded++; + ++total_decoded; - if (total_decoded > MESSAGE_MAX_PER_FRAME) + // Time-box processing of network packets to prevent framerate catastrophe + if (check_message_timer.getElapsedTimeF32() >= CheckMessagesMaxTime) + { + // Drain the socket buffer so we know how many messages remain to process + S32 num_buffered_packets = gMessageSystem->drainUdpSocket(); + if (num_buffered_packets > total_decoded) { - needs_drain = true; - break; + // Grow CheckMessagesMaxTime until we process more packets each frame than arrive. + // This might spiral out of control on very slow computers on fast networks when + // the bandwidth settings are too high. There is a mechanism for providing backpressure + // to network bandwidth but it may be inadequate for the task + // (see LLViewerThrottle::updateDynamicThrottle() for more details). + CheckMessagesMaxTime *= 1.035f; // 3.5% ~= 2x in 20 frames, ~8x in 60 frames } - - // 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) + else if (num_buffered_packets == 0) { - needs_drain = true; - break; + // Reset CheckMessagesMaxTime to default value + CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; } + break; } - if (needs_drain || gMessageSystem->mPacketRing.getNumBufferedPackets() > 0) + + if (total_decoded > MESSAGE_MAX_PER_FRAME) { - // 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 - } + // MESSAGE_MAX_PER_FRAME is very high (400) + // We expect to run out of time before reaching here, but just in case... + gMessageSystem->drainUdpSocket(); + break; } - else + + if (gDoDisconnect) { - // Reset CheckMessagesMaxTime to default value - CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; + // We're disconnecting so no need to process packets. + break; } + } - // Handle per-frame message system processing. + // Handle per-frame message system processing. - static LLCachedControl<F32> ack_collection_time(gSavedSettings, "AckCollectTime", 0.1f); - lmc.processAcks(ack_collection_time()); - } + static LLCachedControl<F32> ack_collection_time(gSavedSettings, "AckCollectTime", 0.1f); + lmc.processAcks(ack_collection_time()); } add(LLStatViewer::NUM_NEW_OBJECTS, gObjectList.mNumNewObjects); @@ -5923,6 +6286,9 @@ void LLAppViewer::disconnectViewer() // Pass the connection state to LLUrlEntryParcel not to attempt // parcel info requests while disconnected. LLUrlEntryParcel::setDisconnected(gDisconnected); + + // Restore default OS hibernation mode + setPermitOSHibernation(true); } void LLAppViewer::forceErrorLLError() @@ -5943,11 +6309,13 @@ void LLAppViewer::forceErrorBreakpoint() LL_WARNS() << "Forcing a deliberate breakpoint" << LL_ENDL; #ifdef LL_WINDOWS DebugBreak(); -#elif __i386__ || __x86_64__ +#else +#if defined(LL_X86) || defined(LL_X86_64) asm ("int $3"); #else __builtin_trap(); #endif +#endif return; } @@ -6135,6 +6503,32 @@ F32 LLAppViewer::getMainloopTimeoutSec() const } } +std::string LLAppViewer::getMainloopWatchdogState() const +{ + if (!mMainloopTimeout) + { + return std::string(); + } + std::string state = mMainloopTimeout->getState(); + + if (mMainloopTimeout->hasExpired()) + { + return "Expired at " + state; + } + + // Check if the watchdog is currently active (timer started) + if (!mMainloopTimeout->isAlive()) + { + // Timer is not running, meaning watchdog is paused/stopped + if (state.empty()) + { + return "Paused"; + } + return "Paused at " + state; + } + return state; +} + void LLAppViewer::handleLoginComplete() { gLoggedInTime.start(); @@ -6186,6 +6580,15 @@ void LLAppViewer::handleLoginComplete() // we logged in successfully, so save settings on logout LL_INFOS() << "Login successful, per account settings will be saved on log out." << LL_ENDL; mSavePerAccountSettings=true; + + // Don't allow hibernation while we're running + setPermitOSHibernation(false); + // Track 'hibernation' mode changes + mOSHibernationModeChangeConnection = gSavedSettings.getControl("OSHibernationMode")->getSignal()->connect([](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val) + { + // setPermitOSHibernation will sort itself out based on new mode. + LLAppViewer::instance()->setPermitOSHibernation(false); + }); } //virtual diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index d76e5015e9..837b598ae5 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -17,7 +17,7 @@ * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -76,9 +76,10 @@ typedef enum LAST_EXEC_LOGOUT_CRASH, LAST_EXEC_BAD_ALLOC, LAST_EXEC_MISSING_FILES, - LAST_EXEC_GRAPHICS_INIT, + LAST_EXEC_INIT, LAST_EXEC_UNKNOWN, LAST_EXEC_LOGOUT_UNKNOWN, + LAST_EXEC_OS_EVENT, LAST_EXEC_COUNT } eLastExecEvent; @@ -113,6 +114,7 @@ public: const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. void earlyExitNoNotify(); // Do not display error dialog then forcibly quit. void abortQuit(); // Called to abort a quit request. + void sendViewerStatistics(bool include_preferences); bool quitRequested() { return mQuitRequested; } bool logoutRequestSent() { return mLogoutRequestSent; } @@ -210,6 +212,7 @@ public: void pingMainloopTimeout(std::string_view state); F32 getMainloopTimeoutSec() const; + std::string getMainloopWatchdogState() const; // Handle the 'login completed' event. // *NOTE:Mani Fix this for login abstraction!! @@ -254,6 +257,10 @@ public: void createErrorMarker(eLastExecEvent error_code) const; bool errorMarkerExists() const; + void createCloseRequestMarker() const; + void removeCloseRequestMarker() const; + void createInitedMarker() const; + void removeInitedMarker() const; void createWatchdogMarker() const; void removeWatchdogMarker() const; @@ -263,6 +270,8 @@ public: // Note: mQuitRequested can be aborted by user. void outOfMemorySoftQuit(); + virtual void setPermitOSHibernation(bool permit); + #ifdef LL_DISCORD static void initDiscordSocial(); static void updateDiscordActivity(); @@ -274,10 +283,19 @@ protected: virtual bool initWindow(); // Initialize the viewer's window. virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system virtual void initConsole() {}; // Initialize OS level debugging console. + virtual void cleanupConsole() {}; // Cleanup OS level debugging console. virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit. virtual bool initSLURLHandler(); virtual bool sendURLToOtherInstance(const std::string& url); + typedef enum + { + LL_HIBERNATE_MODE_DEFAULT = 0, // Use the platform's default behavior. + LL_HIBERNATE_MODE_PREVENT = 1, + LL_HIBERNATE_MODE_PREVENT_SCREEN = 2, + } eHibernationMode; + virtual void setOSHibernationMode(eHibernationMode mode); + virtual bool initParseCommandLine(LLCommandLineParser& clp) { return true; } // Allow platforms to specify the command line args. @@ -303,6 +321,7 @@ private: bool initThreads(); // Initialize viewer threads, return false on failure. bool initConfiguration(); // Initialize settings from the command line/config file. void initStrings(); // Initialize LLTrans machinery + void loadLocalizedSettingsComments(); // Override Debug Settings comments for current locale bool initCache(); // Initialize local client cache. // We have switched locations of both Mac and Windows cache, make sure @@ -384,6 +403,9 @@ private: LLAppCoreHttp mAppCoreHttp; bool mIsFirstRun; + + eHibernationMode mCurrentHibernationMode = LL_HIBERNATE_MODE_DEFAULT; + boost::signals2::scoped_connection mOSHibernationModeChangeConnection; }; // Globals with external linkage. From viewer.h diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 728a8ef81e..cb899ef577 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -34,52 +34,28 @@ #include "llurldispatcher.h" // SLURL from other app instance #include "llviewernetwork.h" #include "llviewercontrol.h" -#include "llwindowsdl.h" #include "llmd5.h" #include "llfindlocale.h" +#include "llversioninfo.h" #include <exception> -#if LL_GLIB -#include <gio/gio.h> -#endif -#include <netinet/in.h> -#include <resolv.h> +#define SDL_MAIN_USE_CALLBACKS +#include <SDL3/SDL_main.h> -#if (__GLIBC__*1000 + __GLIBC_MINOR__) >= 2034 -extern "C" -{ - int __res_nquery(res_state statep, - const char *dname, int qclass, int type, - unsigned char *answer, int anslen) - { - return res_nquery( statep, dname, qclass, type, answer, anslen ); - } +#include "SDL3/SDL.h" - int __dn_expand(const unsigned char *msg, - const unsigned char *eomorig, - const unsigned char *comp_dn, char *exp_dn, - int length) - { - return dn_expand( msg,eomorig,comp_dn,exp_dn,length); - } -} -#endif - -#if LL_SEND_CRASH_REPORTS -#include "breakpad/client/linux/handler/exception_handler.h" -#include "breakpad/common/linux/http_upload.h" -#include "lldir.h" -#include "../llcrashlogger/llcrashlogger.h" -#include "jsoncpp/reader.h" // JSON +#include "llsdl.h" +#include "llwindowsdl.h" +#ifdef LL_GLIB +#include <gio/gio.h> #endif #define VIEWERAPI_SERVICE "com.secondlife.ViewerAppAPIService" #define VIEWERAPI_PATH "/com/secondlife/ViewerAppAPI" #define VIEWERAPI_INTERFACE "com.secondlife.ViewerAppAPI" -#if LL_GLIB static const char * DBUS_SERVER = "<node name=\"/com/secondlife/ViewerAppAPI\">\n" " <interface name=\"com.secondlife.ViewerAppAPI\">\n" " <annotation name=\"org.freedesktop.DBus.GLib.CSymbol\" value=\"viewer_app_api\"/>\n" @@ -94,15 +70,110 @@ typedef struct { GObject parent; } ViewerAppAPI; -#endif namespace { int gArgC = 0; char **gArgV = NULL; + LLAppViewerLinux* gViewerAppPtr = NULL; void (*gOldTerminateHandler)() = NULL; } +// Initialize static members +guint32 LLAppViewerLinux::sPowerInhibitCookie = 0; +bool LLAppViewerLinux::sPowerInhibitActive = false; + +void check_vm_bloat() +{ +#if LL_LINUX + // watch our own VM and RSS sizes, warn if we bloated rapidly + static const std::string STATS_FILE = "/proc/self/stat"; + FILE *fp = fopen(STATS_FILE.c_str(), "r"); + if (fp) + { + static long long last_vm_size = 0; + static long long last_rss_size = 0; + const long long significant_vm_difference = 250 * 1024*1024; + const long long significant_rss_difference = 50 * 1024*1024; + long long this_vm_size = 0; + long long this_rss_size = 0; + + ssize_t res; + size_t dummy; + char *ptr = nullptr; + for (int i=0; i<22; ++i) // parse past the values we don't want + { + res = getdelim(&ptr, &dummy, ' ', fp); + if (-1 == res) + { + LL_WARNS() << "Unable to parse " << STATS_FILE << LL_ENDL; + goto finally; + } + free(ptr); + ptr = nullptr; + } + // 23rd space-delimited entry is vsize + res = getdelim(&ptr, &dummy, ' ', fp); + llassert(ptr); + if (-1 == res) + { + LL_WARNS() << "Unable to parse " << STATS_FILE << LL_ENDL; + goto finally; + } + this_vm_size = atoll(ptr); + free(ptr); + ptr = nullptr; + // 24th space-delimited entry is RSS + res = getdelim(&ptr, &dummy, ' ', fp); + llassert(ptr); + if (-1 == res) + { + LL_WARNS() << "Unable to parse " << STATS_FILE << LL_ENDL; + goto finally; + } + this_rss_size = getpagesize() * atoll(ptr); + free(ptr); + ptr = nullptr; + + LL_INFOS() << "VM SIZE IS NOW " << (this_vm_size/(1024*1024)) << " MB, RSS SIZE IS NOW " << (this_rss_size/(1024*1024)) << " MB" << LL_ENDL; + + if (llabs(last_vm_size - this_vm_size) > significant_vm_difference) + { + if (this_vm_size > last_vm_size) + { + LL_WARNS() << "VM size grew by " << (this_vm_size - last_vm_size)/(1024*1024) << " MB in last frame" << LL_ENDL; + } + else + { + LL_INFOS() << "VM size shrank by " << (last_vm_size - this_vm_size)/(1024*1024) << " MB in last frame" << LL_ENDL; + } + } + + if (llabs(last_rss_size - this_rss_size) > significant_rss_difference) + { + if (this_rss_size > last_rss_size) + { + LL_WARNS() << "RSS size grew by " << (this_rss_size - last_rss_size)/(1024*1024) << " MB in last frame" << LL_ENDL; + } + else + { + LL_INFOS() << "RSS size shrank by " << (last_rss_size - this_rss_size)/(1024*1024) << " MB in last frame" << LL_ENDL; + } + } + + last_rss_size = this_rss_size; + last_vm_size = this_vm_size; + +finally: + if (ptr) + { + free(ptr); + ptr = nullptr; + } + fclose(fp); + } +#endif // LL_LINUX +} static void exceptionTerminateHandler() { @@ -116,17 +187,19 @@ static void exceptionTerminateHandler() gOldTerminateHandler(); // call old terminate() handler } -int main( int argc, char **argv ) +SDL_AppResult SDL_AppInit(void **appstate, 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"); + gSDLMainHandled = true; + gArgC = argc; gArgV = argv; - LLAppViewer* viewer_app_ptr = new LLAppViewerLinux(); + gViewerAppPtr = new LLAppViewerLinux(); // install unexpected exception handler gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler); @@ -137,18 +210,68 @@ int main( int argc, char **argv ) setenv("LD_PRELOAD", "libpthread.so libGL.so.1", 1); # endif setenv("__GL_THREADED_OPTIMIZATIONS", "1", 0); + //unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins. - bool ok = viewer_app_ptr->init(); + // This needs to be set as early as possible + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_NAME_STRING, LLVersionInfo::getInstance()->getChannel().c_str()); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_VERSION_STRING, LLVersionInfo::getInstance()->getVersion().c_str()); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_IDENTIFIER_STRING, "com.secondlife.indra.viewer"); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_CREATOR_STRING, "Linden Research Inc"); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Copyright (c) Linden Research, Inc. 2025"); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_URL_STRING, "https://www.secondlife.com"); + SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_TYPE_STRING, "game"); + + bool ok = gViewerAppPtr->init(); if(!ok) { LL_WARNS() << "Application init failed." << LL_ENDL; - return -1; + return SDL_APP_FAILURE; } - // Run the application main loop - while (! viewer_app_ptr->frame()) - {} + return SDL_APP_CONTINUE; +} +SDL_AppResult SDL_AppIterate(void *appstate) +{ + // Run the application main loop + if (!gViewerAppPtr->frame()) + { +#if LL_GLIB + // Pump until we've nothing left to do or passed 1/15th of a + // second pumping for this frame. + static LLTimer pump_timer; + pump_timer.reset(); + pump_timer.setTimerExpirySec(1.0f / 15.0f); + do + { + g_main_context_iteration(g_main_context_default(), false); + } while( g_main_context_pending(g_main_context_default()) && !pump_timer.hasExpired()); +#endif + + // hack - doesn't belong here - but this is just for debugging + if (getenv("LL_DEBUG_BLOAT")) + { + check_vm_bloat(); + } + + return SDL_APP_CONTINUE; + } + + if(LLApp::isError()) + { + return SDL_APP_FAILURE; + } + + return SDL_APP_SUCCESS; +} + +SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) +{ + return LLWindowSDL::handleEvents(*event); +} + +void SDL_AppQuit(void *appstate, SDL_AppResult result) +{ if (!LLApp::isError()) { // @@ -156,11 +279,11 @@ int main( int argc, char **argv ) // the assumption is that the error handler is responsible for doing // app cleanup if there was a problem. // - viewer_app_ptr->cleanup(); + gViewerAppPtr->cleanup(); } - delete viewer_app_ptr; - viewer_app_ptr = NULL; - return 0; + + delete gViewerAppPtr; + gViewerAppPtr = nullptr; } LLAppViewerLinux::LLAppViewerLinux() @@ -169,76 +292,22 @@ LLAppViewerLinux::LLAppViewerLinux() LLAppViewerLinux::~LLAppViewerLinux() { -} - -#if LL_SEND_CRASH_REPORTS -std::string gCrashLogger; -std::string gVersion; -std::string gBugsplatDB; -std::string gCrashBehavior; - -static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) -{ - if( fork() == 0 ) - execl( gCrashLogger.c_str(), gCrashLogger.c_str(), descriptor.path(), gVersion.c_str(), gBugsplatDB.c_str(), gCrashBehavior.c_str(), nullptr ); - return succeeded; -} - -void setupBreadpad() -{ - std::string build_data_fname(gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "build_data.json")); - gCrashLogger = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "linux-crash-logger.bin"); - - llifstream inf(build_data_fname.c_str()); - if(!inf.is_open()) - { - LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, can't read '" << build_data_fname << "'" << LL_ENDL; - return; - } - - Json::Reader reader; - Json::Value build_data; - if(!reader.parse(inf, build_data, false)) + // Clean up any power management inhibition on exit + if (sPowerInhibitActive) { - LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, can't parse '" << build_data_fname << "': " - << reader.getFormatedErrorMessages() << LL_ENDL; - return; + uninhibitPowerManagement(); } - - Json::Value BugSplat_DB = build_data["BugSplat DB"]; - if(!BugSplat_DB) - { - LL_WARNS("BUGSPLAT") << "Can't initialize BugSplat, no 'BugSplat DB' entry in '" << build_data_fname - << "'" << LL_ENDL; - return; - } - gVersion = STRINGIZE( - LL_VIEWER_VERSION_MAJOR << '.' << LL_VIEWER_VERSION_MINOR << '.' << LL_VIEWER_VERSION_PATCH - << '.' << LL_VIEWER_VERSION_BUILD); - gBugsplatDB = BugSplat_DB.asString(); - - LL_INFOS("BUGSPLAT") << "Initializing with crash logger: " << gCrashLogger << " database: " << gBugsplatDB << " version: " << gVersion << LL_ENDL; - - google_breakpad::MinidumpDescriptor *descriptor = new google_breakpad::MinidumpDescriptor(gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "")); - google_breakpad::ExceptionHandler *eh = new google_breakpad::ExceptionHandler(*descriptor, NULL, dumpCallback, NULL, true, -1); } -#endif bool LLAppViewerLinux::init() { bool success = LLAppViewer::init(); #if LL_SEND_CRASH_REPORTS - S32 nCrashSubmitBehavior = gCrashSettings.getS32("CrashSubmitBehavior"); - - // For the first version we just consider always send and create a nice dialog for CRASH_BEHAVIOR_ASK later. - if (success && nCrashSubmitBehavior != CRASH_BEHAVIOR_NEVER_SEND ) + if (success) { - if( nCrashSubmitBehavior == CRASH_BEHAVIOR_ASK ) - gCrashBehavior = "ask"; - else - gCrashBehavior = "send"; - setupBreadpad(); + LLAppViewer* pApp = LLAppViewer::instance(); + pApp->initCrashReporting(); } #endif @@ -403,67 +472,180 @@ bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url) } #endif // LL_GLIB -void LLAppViewerLinux::initCrashReporting(bool reportFreeze) + +#if LL_GLIB + +namespace { - std::string cmd =gDirUtilp->getExecutableDir(); - cmd += gDirUtilp->getDirDelimiter(); -//#if LL_LINUX - cmd += "linux-crash-logger.bin"; -/* -#else -# error Unknown platform -#endif -*/ + // Session-bus sleep inhibitors, tried in order; both hand back a uint cookie. + struct PowerInhibitor + { + const char* service; + const char* path; + const char* iface; + const char* uninhibit; + bool gnome_args; + }; + + const PowerInhibitor POWER_INHIBITORS[] = + { + { "org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit", + "org.freedesktop.PowerManagement.Inhibit", "UnInhibit", false }, + { "org.gnome.SessionManager", "/org/gnome/SessionManager", + "org.gnome.SessionManager", "Uninhibit", true } + }; + + const PowerInhibitor* sActiveInhibitor = nullptr; - std::stringstream pid_str; - pid_str << LLApp::getPid(); - std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); - std::string appname = gDirUtilp->getExecutableFilename(); - std::string grid{ LLGridManager::getInstance()->getGridId() }; - std::string title{ LLAppViewer::instance()->getSecondLifeTitle() }; - std::string pidstr{ pid_str.str() }; - // launch the actual crash logger - const char * cmdargv[] = - {cmd.c_str(), - "-user", - grid.c_str(), - "-name", - title.c_str(), - "-pid", - pidstr.c_str(), - "-dumpdir", - logdir.c_str(), - "-procname", - appname.c_str(), - NULL}; - fflush(NULL); + // Returns the reply, or null on failure. Takes ownership of args. + GVariant* call_power_manager(const PowerInhibitor& inhibitor, const char* method, GVariant* args, + const GVariantType* reply_type) + { + g_variant_ref_sink(args); + + GDBusConnection* bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); + if (!bus) + { + LL_WARNS("OS") << "Getting dbus failed." << LL_ENDL; + g_variant_unref(args); + return nullptr; + } + + GError* error = nullptr; + GVariant* result = g_dbus_connection_call_sync(bus, inhibitor.service, inhibitor.path, + inhibitor.iface, method, args, reply_type, + G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error); + if (!result) + { + LL_DEBUGS("OS") << inhibitor.service << "." << method << " failed: " + << (error ? error->message : "unknown error") << LL_ENDL; + } + if (error) + { + g_error_free(error); + } + + g_variant_unref(args); + g_object_unref(bus); + return result; + } +} + +#endif // LL_GLIB + +void LLAppViewerLinux::setOSHibernationMode(eHibernationMode mode) +{ + if (mode == LL_HIBERNATE_MODE_DEFAULT) + { + // Allow OS to sleep/hibernate - remove any inhibition + if (sPowerInhibitActive) + { + uninhibitPowerManagement(); + LL_INFOS("OS") << "Permitted OS hibernation/sleep" << LL_ENDL; + } + } + else if (mode == LL_HIBERNATE_MODE_PREVENT) + { + // Prevent system sleep, but allow display to turn off + // Release any existing inhibition first to allow mode switching + if (sPowerInhibitActive) + { + uninhibitPowerManagement(); + } - pid_t pid = fork(); - if (pid == 0) - { // child - execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */ - LL_WARNS() << "execv failure when trying to start " << cmd << LL_ENDL; - _exit(1); // avoid atexit() + if (inhibitPowerManagement(false)) + { + LL_INFOS("OS") << "Prevented OS hibernation/sleep, display sleep allowed" << LL_ENDL; + } + else + { + LL_WARNS("OS") << "Failed to prevent OS hibernation/sleep" << LL_ENDL; + } } - else + else if (mode == LL_HIBERNATE_MODE_PREVENT_SCREEN) { - if (pid > 0) + // Prevent both system and display sleep + // Release any existing inhibition first to allow mode switching + if (sPowerInhibitActive) { - // DO NOT wait for child proc to die; we want - // the logger to outlive us while we quit to - // free up the screen/keyboard/etc. - ////int childExitStatus; - ////waitpid(pid, &childExitStatus, 0); + uninhibitPowerManagement(); + } + + if (inhibitPowerManagement(true)) + { + LL_INFOS("OS") << "Prevented OS hibernation/sleep and display sleep" << LL_ENDL; } else { - LL_WARNS() << "fork failure." << LL_ENDL; + LL_WARNS("OS") << "Failed to prevent OS hibernation/sleep and display sleep" << LL_ENDL; } } - // Sometimes signals don't seem to quit the viewer. Also, we may - // have been called explicitly instead of from a signal handler. - // Make sure we exit so as to not totally confuse the user. - //_exit(1); // avoid atexit(), else we may re-crash in dtors. +} + +// TODO: This is AI Generated!!!, needs review and testing. +bool LLAppViewerLinux::inhibitPowerManagement(bool inhibit_display) +{ +#if LL_GLIB + const char* reason = inhibit_display ? + "Viewer active - preventing system and display sleep" : + "Viewer active - preventing system sleep"; + + for (const PowerInhibitor& inhibitor : POWER_INHIBITORS) + { + // Inhibit(app: s, reason: s) -> u, or GNOME's Inhibit(app: s, xid: u, reason: s, flags: u) -> u + // GNOME flags: 4 = suspend, 8 = idle (display), 12 = both + GVariant* args = inhibitor.gnome_args ? + g_variant_new("(susu)", "SecondLifeViewer", (guint32)0, reason, + (guint32)(inhibit_display ? 12 : 4)) : + g_variant_new("(ss)", "Second Life Viewer", reason); + + GVariant* result = call_power_manager(inhibitor, "Inhibit", args, G_VARIANT_TYPE("(u)")); + if (!result) + { + continue; + } + + guint32 cookie = 0; + g_variant_get(result, "(u)", &cookie); + g_variant_unref(result); + + sPowerInhibitCookie = cookie; + sPowerInhibitActive = true; + sActiveInhibitor = &inhibitor; + LL_INFOS("OS") << "Successfully inhibited power management using " + << inhibitor.service << LL_ENDL; + return true; + } +#endif // LL_GLIB + + return false; +} + +void LLAppViewerLinux::uninhibitPowerManagement() +{ +#if LL_GLIB + if (sPowerInhibitActive && sActiveInhibitor) + { + GVariant* result = call_power_manager(*sActiveInhibitor, sActiveInhibitor->uninhibit, + g_variant_new("(u)", (guint32)sPowerInhibitCookie), + nullptr); + if (result) + { + g_variant_unref(result); + LL_INFOS("OS") << "Successfully uninhibited power management using " + << sActiveInhibitor->service << LL_ENDL; + } + + sActiveInhibitor = nullptr; + } +#endif // LL_GLIB + + sPowerInhibitCookie = 0; + sPowerInhibitActive = false; +} + +void LLAppViewerLinux::initCrashReporting(bool reportFreeze) +{ } bool LLAppViewerLinux::beingDebugged() @@ -494,7 +676,7 @@ bool LLAppViewerLinux::beingDebugged() base += 1; } - if (strcmp(base, "gdb") == 0) + if (strcmp(base, "gdb") == 0 || strcmp(base, "lldb") == 0) { debugged = yes; } @@ -506,18 +688,6 @@ bool LLAppViewerLinux::beingDebugged() return debugged == yes; } -void LLAppViewerLinux::initLoggingAndGetLastDuration() -{ - // Remove the last stack trace, if any - // This file is no longer created, since the move to Google Breakpad - // The code is left here to clean out any old state in the log dir - std::string old_stack_file = - gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); - LLFile::remove(old_stack_file); - - LLAppViewer::initLoggingAndGetLastDuration(); -} - bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp) { if (!clp.parseCommandLine(gArgC, gArgV)) diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index 460ca721f1..faac3c0a05 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -27,36 +27,49 @@ #ifndef LL_LLAPPVIEWERLINUX_H #define LL_LLAPPVIEWERLINUX_H +extern "C" { +# include <glib.h> +} + #ifndef LL_LLAPPVIEWER_H #include "llappviewer.h" #endif class LLCommandLineParser; -class LLAppViewerLinux : public LLAppViewer +class LLAppViewerLinux final : public LLAppViewer { public: LLAppViewerLinux(); - virtual ~LLAppViewerLinux(); + ~LLAppViewerLinux() override; // // Main application logic // - virtual bool init(); // Override to do application initialization - std::string generateSerialNumber(); + bool init() override; // Override to do application initialization + std::string generateSerialNumber() override; bool setupSLURLHandler(); protected: - virtual bool beingDebugged(); + bool beingDebugged() override; + + bool restoreErrorTrap() override; + void initCrashReporting(bool reportFreeze); + + bool initParseCommandLine(LLCommandLineParser& clp) override; - virtual bool restoreErrorTrap(); - virtual void initCrashReporting(bool reportFreeze); + bool initSLURLHandler() override; + bool sendURLToOtherInstance(const std::string& url) override; + void setOSHibernationMode(eHibernationMode mode) override; - virtual void initLoggingAndGetLastDuration(); - virtual bool initParseCommandLine(LLCommandLineParser& clp); +private: + // Power management state tracking + static guint32 sPowerInhibitCookie; + static bool sPowerInhibitActive; - virtual bool initSLURLHandler(); - virtual bool sendURLToOtherInstance(const std::string& url); + // Helper methods for power management + bool inhibitPowerManagement(bool inhibit_display); + void uninhibitPowerManagement(); }; #endif // LL_LLAPPVIEWERLINUX_H diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h index 3fbf4202f1..13b8056193 100644 --- a/indra/newview/llappviewermacosx-objc.h +++ b/indra/newview/llappviewermacosx-objc.h @@ -31,5 +31,7 @@ #include <vector> void force_ns_sxeption(); +void register_url_schemes(); +void set_os_hibernation_mode(int mode); #endif // LL_LLAPPVIEWERMACOSX_OBJC_H diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm index 96a6bc6edc..ab4ae428b9 100644 --- a/indra/newview/llappviewermacosx-objc.mm +++ b/indra/newview/llappviewermacosx-objc.mm @@ -29,6 +29,7 @@ #endif #import <Cocoa/Cocoa.h> +#import <IOKit/pwr_mgt/IOPMLib.h> #include <iostream> #include "llappviewermacosx-objc.h" @@ -38,3 +39,93 @@ void force_ns_sxeption() NSException *exception = [NSException exceptionWithName:@"Forced NSException" reason:nullptr userInfo:nullptr]; @throw exception; } + +void register_url_schemes() +{ + @autoreleasepool // Objective-C automatic memory tracking and release. + { + NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; + NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath]; + + // Force Launch Services to re-register this app bundle + OSStatus status = LSRegisterURL((__bridge CFURLRef)bundleURL, true); + + if (status == noErr) + { + // Explicitly set this app as the default handler for our URL schemes + NSArray *schemes = @[@"secondlife", @"x-grid-location-info"]; + NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier]; + + for (NSString *scheme in schemes) + { + LSSetDefaultHandlerForURLScheme((__bridge CFStringRef)scheme, + (__bridge CFStringRef)bundleID); + } + } + } +} + +// Add these as static variables at file scope +static IOPMAssertionID gPowerAssertionID = kIOPMNullAssertionID; + +void set_os_hibernation_mode(int mode) +{ + // Release existing assertion + if (gPowerAssertionID != kIOPMNullAssertionID) + { + IOReturn result = IOPMAssertionRelease(gPowerAssertionID); + if (result == kIOReturnSuccess) + { + gPowerAssertionID = kIOPMNullAssertionID; + NSLog(@"Permitted OS hibernation/sleep"); + } + else + { + NSLog(@"Failed to release power assertion: %d", result); + } + } + + if (mode == 1) + { + // Prevent OS from sleeping/hibernating + CFStringRef assertionName = CFSTR("Second Life Viewer"); + // kIOPMAssertionTypeNoIdleSleep prevents idle sleep + IOReturn result = IOPMAssertionCreateWithName( + kIOPMAssertionTypeNoIdleSleep, + kIOPMAssertionLevelOn, + assertionName, + &gPowerAssertionID + ); + + if (result == kIOReturnSuccess) + { + NSLog(@"Prevented OS hibernation/sleep, allow display sleep"); + } + else + { + NSLog(@"Failed to create power assertion: %d", result); + } + } + else if (mode == 2) + { + // Prevent OS from sleeping/hibernating, prevent screen from going off + CFStringRef assertionName = CFSTR("Second Life Viewer"); + // kIOPMAssertionTypeNoIdleSleep prevents idle sleep + // kIOPMAssertionTypeNoDisplaySleep prevents display sleep + IOReturn result = IOPMAssertionCreateWithName( + kIOPMAssertionTypeNoDisplaySleep, + kIOPMAssertionLevelOn, + assertionName, + &gPowerAssertionID + ); + + if (result == kIOReturnSuccess) + { + NSLog(@"Prevented OS hibernation/sleep or screen from turning off"); + } + else + { + NSLog(@"Failed to create power assertion: %d", result); + } + } +} diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 2bd9c8661a..c188bb459f 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -49,6 +49,7 @@ #include "llerrorcontrol.h" #include "llvoavatarself.h" // for gAgentAvatarp->getFullname() #include <ApplicationServices/ApplicationServices.h> +#include "llwindowmacosx_iokit.h" #ifdef LL_CARBON_CRASH_HANDLER #include <Carbon/Carbon.h> #endif @@ -125,6 +126,7 @@ bool pumpMainLoop() void cleanupViewer() { + set_os_hibernation_mode(0); // restore default OS hibernation behavior if(!LLApp::isError()) { if (gViewerAppPtr) @@ -412,6 +414,27 @@ bool LLAppViewerMacOSX::restoreErrorTrap() return reset_count == 0; } +bool LLAppViewerMacOSX::initSLURLHandler() +{ + if (isSecondInstance()) + { + return false; + } + // Main secondlife:// registration is in info.plist, but macOS + // Launch Services caches URL scheme handlers, and a different + // viewer might still be registered. + // Register URL schemes with Launch Services on every launch + register_url_schemes(); + + return true; +} + +void LLAppViewerMacOSX::setOSHibernationMode(eHibernationMode mode) +{ + // pass to objective-c++ + set_os_hibernation_mode((int)mode); +} + std::string LLAppViewerMacOSX::generateSerialNumber() { char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore @@ -419,7 +442,7 @@ std::string LLAppViewerMacOSX::generateSerialNumber() // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html CFStringRef serialNumber = NULL; - io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, + io_service_t platformExpert = IOServiceGetMatchingService(kLLIOMainPort, IOServiceMatching("IOPlatformExpertDevice")); if (platformExpert) { diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index d50812a35e..1153bd4191 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -46,6 +46,8 @@ public: protected: virtual bool restoreErrorTrap(); + virtual bool initSLURLHandler(); + virtual void setOSHibernationMode(eHibernationMode mode); std::string generateSerialNumber(); virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index afff5f2cf2..77f00b05f3 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -31,7 +31,7 @@ #endif #include "llwin32headers.h" -#if !LL_SDL +#if !LL_SDL_WINDOW #include "llwindowwin32.h" // *FIX: for setting gIconResource. #endif @@ -80,6 +80,7 @@ #if LL_VELOPACK #include "llvelopack.h" #endif +#include "llversioninfovars.h" // Bugsplat (http://bugsplat.com) crash reporting tool #ifdef LL_BUGSPLAT @@ -209,6 +210,13 @@ namespace LLAppViewer* app = LLAppViewer::instance(); + // Include mainloop watchdog state if available + std::string watchdog_state = app->getMainloopWatchdogState(); + if (!watchdog_state.empty()) + { + sBugSplatSender->setAttribute(WCSTR(L"WatchdogState"), WCSTR(watchdog_state)); + } + if (!app->isSecondInstance() && !app->errorMarkerExists()) { // If marker doesn't exist, create a marker with 'other' or 'logout' code for next launch @@ -230,6 +238,8 @@ namespace } #endif // LL_BUGSPLAT +extern bool gGPUBenchmarkMode; + namespace { void (*gOldTerminateHandler)() = NULL; @@ -482,7 +492,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, DWORD heap_enable_lfh_error[MAX_HEAPS]; S32 num_heaps = 0; -#if !LL_SDL +#if !LL_SDL_WINDOW LLWindowWin32::setDPIAwareness(); #endif @@ -513,18 +523,27 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, #endif #endif -#if !LL_SDL +#if !LL_SDL_WINDOW // *FIX: global gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); #endif gIconSmallResource = MAKEINTRESOURCE(IDI_LL_ICON_SMALL); + // Benchmark subprocess mode before full init for LLFeatureManager::loadGPUClass(). + { + std::wstring cmdLineStr(pCmdLine ? pCmdLine : L""); + if (cmdLineStr.find(L"--gpubenchmark") != std::wstring::npos) + { + gGPUBenchmarkMode = true; + } + } + LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(ll_convert_wide_to_string(pCmdLine).c_str()); gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler); // Set a debug info flag to indicate if multiple instances are running. - bool found_other_instance = !create_app_mutex(); + bool found_other_instance = gGPUBenchmarkMode || !create_app_mutex(); gDebugInfo["FoundOtherInstanceAtStartup"] = LLSD::Boolean(found_other_instance); bool ok = viewer_app_ptr->init(); @@ -868,12 +887,7 @@ bool LLAppViewerWin32::cleanup() bool result = LLAppViewer::cleanup(); gDXHardware.cleanup(); - - if (mIsConsoleAllocated) - { - FreeConsole(); - mIsConsoleAllocated = false; - } + cleanupConsole(); return result; } @@ -953,10 +967,22 @@ void LLAppViewerWin32::initLoggingAndGetLastDuration() void LLAppViewerWin32::initConsole() { // pop up debug console - mIsConsoleAllocated = create_console(); + if (!gGPUBenchmarkMode) + { + mIsConsoleAllocated = create_console(); + } return LLAppViewer::initConsole(); } +void LLAppViewerWin32::cleanupConsole() +{ + if (mIsConsoleAllocated) + { + FreeConsole(); + mIsConsoleAllocated = false; + } +} + void write_debug_dx(const char* str) { std::string value = gDebugInfo["DXInfo"].asString(); @@ -1029,7 +1055,7 @@ bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url) if (other_window != NULL) { - LL_DEBUGS() << "Found other window with the name '" << getWindowTitle() << "'" << LL_ENDL; + LL_DEBUGS("AppInit") << "Found other window with the name '" << getWindowTitle() << "'" << LL_ENDL; COPYDATASTRUCT cds; const S32 SLURL_MESSAGE_TYPE = 0; cds.dwData = SLURL_MESSAGE_TYPE; @@ -1037,13 +1063,281 @@ bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url) cds.lpData = (void*)url.c_str(); LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds); - LL_DEBUGS() << "SendMessage(WM_COPYDATA) to other window '" + LL_DEBUGS("AppInit") << "SendMessage(WM_COPYDATA) to other window '" << getWindowTitle() << "' returned " << msg_result << LL_ENDL; return true; } return false; } +void LLAppViewerWin32::setOSHibernationMode(eHibernationMode mode) +{ + // ES_CONTINUOUS tells Windows to reset the idle timer + // and restore normal operation + // ES_SYSTEM_REQUIRED prevents system sleep/hibernation + // ES_DISPLAY_REQUIRED prevents display sleep + + if (mode == LL_HIBERNATE_MODE_DEFAULT) + { + // Allow OS to hibernate - clear the previous execution state flags + // ES_CONTINUOUS without other flags allows the system to idle normally + SetThreadExecutionState(ES_CONTINUOUS); + LL_INFOS("OS") << "Permitted OS hibernation/sleep" << LL_ENDL; + } + else if (mode == LL_HIBERNATE_MODE_PREVENT) + { + // Prevent OS from hibernating while viewer is running + // ES_CONTINUOUS | ES_SYSTEM_REQUIRED keeps the system awake + EXECUTION_STATE result = SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED + ); + if (result == NULL) + { + LL_WARNS("OS") << "Failed to prevent OS hibernation, error: " << GetLastError() << LL_ENDL; + } + else + { + LL_INFOS("OS") << "Prevented OS hibernation, but allowed display sleep" << LL_ENDL; + } + } + else if (mode == LL_HIBERNATE_MODE_PREVENT_SCREEN) + { + // Prevent OS from hibernating or turning screen off while viewer is running + // ES_CONTINUOUS | ES_SYSTEM_REQUIRED keeps the system awake + // ES_DISPLAY_REQUIRED keeps the display on + EXECUTION_STATE result = SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED + ); + + if (result == NULL) + { + LL_WARNS("OS") << "Failed to prevent OS hibernation and display sleep, error: " << GetLastError() << LL_ENDL; + } + else + { + LL_INFOS("OS") << "Prevented OS hibernation/sleep" << LL_ENDL; + } + } +} + +bool LLAppViewerWin32::sendShutdownToOtherInstances(const std::wstring& install_dir) +{ + // Velopack installs viewer like this: + // %appdata%\Local\ChannelNameViewer\Update.exe // which is our uninstaller + // %appdata%\Local\ChannelNameViewer\SecondLifeViewer.exe // wrapper, redirects to main executable + // %appdata%\Local\ChannelNameViewer\current\SecondLifeViewer.exe // main executable + // For reliability don't expect install_dir to be actually in the base path, strip 'current' + + const std::wstring current_suffix = L"\\current"; + std::wstring normalized_path(install_dir); + if (normalized_path.length() >= current_suffix.length() && + _wcsicmp(normalized_path.c_str() + normalized_path.length() - current_suffix.length(), + current_suffix.c_str()) == 0) + { + normalized_path.resize(normalized_path.length() - current_suffix.length()); + } + + wchar_t window_class[256]; // Assume max length < 255 chars. + mbstowcs(window_class, sWindowClass, 255); + window_class[255] = 0; + + // Normalize the directory path + wchar_t our_dir_normalized[MAX_PATH]; + wchar_t* file_part = nullptr; + DWORD result = GetFullPathNameW(normalized_path.c_str(), MAX_PATH, our_dir_normalized, &file_part); + if (result == 0 || result >= MAX_PATH) + { + LL_WARNS() << "Failed to normalize our executable path" << LL_ENDL; + return false; + } + + // Remove trailing backslash if present + size_t dir_len = wcslen(our_dir_normalized); + if (dir_len > 0 && our_dir_normalized[dir_len - 1] == L'\\') + { + our_dir_normalized[dir_len - 1] = L'\0'; + dir_len--; + } + + // This message is meant for velopack, so we don't expect to have + // a window of our own, store any matching windows. + struct EnumData + { + const wchar_t* target_class; + const wchar_t* our_dir_normalized; + std::vector<HWND> found_windows; + }; + + EnumData enum_data; + enum_data.target_class = window_class; + enum_data.our_dir_normalized = our_dir_normalized; + + // Callback function to find all matching windows + auto find_windows_callback = [](HWND hwnd, LPARAM lParam) -> BOOL + { + EnumData* data = reinterpret_cast<EnumData*>(lParam); + wchar_t class_name[256]; + + if (GetClassName(hwnd, class_name, 256) > 0) + { + if (wcscmp(class_name, data->target_class) == 0) + { + // Get the process ID for this window + DWORD process_id = 0; + GetWindowThreadProcessId(hwnd, &process_id); + + // Open the process to query its executable path + HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_id); + if (hProcess) + { + wchar_t exe_path[MAX_PATH]; + DWORD size = MAX_PATH; + if (QueryFullProcessImageNameW(hProcess, 0, exe_path, &size)) + { + // Normalize the other process's path + wchar_t other_dir_normalized[MAX_PATH]; + wchar_t* other_file_part = nullptr; + DWORD result = GetFullPathNameW(exe_path, MAX_PATH, other_dir_normalized, &other_file_part); + + if (result > 0 && result < MAX_PATH) + { + // Remove the filename part to get just the directory + // We are doing this to avoid incidents, like having + // multiple viewer version exes in the same folder. + if (other_file_part) + { + *other_file_part = L'\0'; + } + + // Remove trailing backslash if present + size_t other_dir_len = wcslen(other_dir_normalized); + if (other_dir_len > 0 && other_dir_normalized[other_dir_len - 1] == L'\\') + { + other_dir_normalized[other_dir_len - 1] = L'\0'; + other_dir_len--; + } + + // Strip "\current" suffix if present to normalize comparison + // This handles both release (with \current) and debug builds (without) + const std::wstring current_suffix = L"\\current"; + if (other_dir_len >= current_suffix.length()) + { + size_t offset = other_dir_len - current_suffix.length(); + if (_wcsicmp(other_dir_normalized + offset, current_suffix.c_str()) == 0) + { + other_dir_normalized[offset] = L'\0'; + } + } + + // Compare directories (case-insensitive) + if (_wcsicmp(other_dir_normalized, data->our_dir_normalized) == 0) + { + data->found_windows.push_back(hwnd); + } + } + } + CloseHandle(hProcess); + } + } + } + + return TRUE; // Continue enumeration + }; + + // Find all matching windows and send shutdown messages + EnumWindows(find_windows_callback, reinterpret_cast<LPARAM>(&enum_data)); + + if (enum_data.found_windows.empty()) + { + LL_DEBUGS("AppInit") << "No other instances found" << LL_ENDL; + return false; + } + + LL_INFOS("AppInit") << "Found " << (S32)(enum_data.found_windows.size()) << " other instance(s), sending shutdown messages" << LL_ENDL; + + // Get our own process ID to include in the message + DWORD our_process_id = GetCurrentProcessId(); + + constexpr UINT timeout_ms = 2000; // 2s. Viewer's message thread is supposed to be fast. + for (HWND other_window : enum_data.found_windows) + { + if (IsWindow(other_window)) + { + DWORD_PTR result = 0; + LRESULT send_result = SendMessageTimeout( + other_window, + WM_POST_UNINSTALL_, + static_cast<WPARAM>(our_process_id), + static_cast<LPARAM>(WM_POST_UNINSTALL_MSG_SHUTDOWN), + SMTO_ABORTIFHUNG | SMTO_BLOCK, + timeout_ms, + &result + ); + + if (send_result == 0) + { + DWORD error = GetLastError(); + if (error == ERROR_TIMEOUT) + { + LL_WARNS("AppInit") << "Shutdown message timed out for window " << std::hex << other_window << std::dec << LL_ENDL; + } + else + { + LL_WARNS("AppInit") << "Failed to send shutdown message to window " << std::hex << other_window + << ", error: " << error << std::dec << LL_ENDL; + } + + PostMessage(other_window, WM_CLOSE, 0, 0); + } + else + { + LL_DEBUGS("AppInit") << "Shutdown message sent successfully to window " << std::hex << other_window << std::dec << LL_ENDL; + } + } + } + + // Poll for up to 30 seconds, checking every 5 seconds + const S32 MAX_WAIT_TIME_MS = 60000; // 30 seconds + const S32 POLL_INTERVAL_MS = 5000; // 5 seconds + S32 elapsed_time_ms = 0; + size_t still_open_count = enum_data.found_windows.size(); + + while (elapsed_time_ms < MAX_WAIT_TIME_MS) + { + LL_INFOS("AppInit") << "Waiting for " << (S32)still_open_count << " instance(s) to close... (" + << (S32)(elapsed_time_ms / 1000) << "s elapsed)" << LL_ENDL; + + ms_sleep(POLL_INTERVAL_MS); + elapsed_time_ms += POLL_INTERVAL_MS; + + // Check if the specific windows we found still exist + // Don't enumerate all windows for new ones, assume that + // no instances were reused and assume user won't open + // the app again. For now just check our list. + still_open_count = 0; + for (HWND hwnd : enum_data.found_windows) + { + if (IsWindow(hwnd)) + { + still_open_count++; + } + } + + if (still_open_count == 0) + { + LL_INFOS("AppInit") << "All other instances have closed after " << (S32)(elapsed_time_ms / 1000) << " seconds" << LL_ENDL; + return false; + } + } + + if (still_open_count != 0) + { + LL_WARNS("AppInit") << "Proceeding with uninstall with " << (S32)still_open_count << " instance(s) still open." << LL_ENDL; + } + + return true; +} + std::string LLAppViewerWin32::generateSerialNumber() { diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 53177f7f95..7c3c7a475a 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -46,10 +46,15 @@ public: bool reportCrashToBugsplat(void* pExcepInfo) override; bool reportCustomToBugsplat(const std::string& description) override; + // returns true if other windows were found and are still running. + static bool sendShutdownToOtherInstances(const std::wstring& install_dir); + 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. + void cleanupConsole() override; + bool initHardwareTest() override; // Win32 uses DX9 to test hardware. bool initParseCommandLine(LLCommandLineParser& clp) override; @@ -57,6 +62,7 @@ protected: bool restoreErrorTrap() override; bool sendURLToOtherInstance(const std::string& url) override; + void setOSHibernationMode(eHibernationMode mode) override; std::string generateSerialNumber(); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index c6b17fcb4e..85d69f0a30 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -338,6 +338,17 @@ void LLAvatarActions::showProfile(const LLUUID& avatar_id) } } +bool LLAvatarActions::myProfileVisible() +{ + LLFloater* floaterp = getProfileFloater(gAgentID); + return floaterp && floaterp->isInVisibleChain(); +} + +bool LLAvatarActions::myPicksTabVisible() +{ + return myProfileVisible() && isPickTabSelected(gAgentID); +} + // static void LLAvatarActions::showPicks(const LLUUID& avatar_id) { @@ -882,6 +893,13 @@ namespace action_give_inventory break; } LLViewerInventoryItem* inv_item = gInventory.getItem(*it); + if (!inv_item) + { + shared = false; + LL_WARNS() << "Failed to share an item " << *it + << ". Item was not found in inventory." << LL_ENDL; + continue; + } if (!inv_item->getPermissions().allowCopyBy(gAgentID)) { if (!noncopy_item_names.empty()) diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index bc4eb6fa60..8c5fe1a460 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -109,6 +109,12 @@ public: static LLFloater* getProfileFloater(const LLUUID& avatar_id); /** + * Profile helpers. + */ + static bool myProfileVisible(); + static bool myPicksTabVisible(); + + /** * Show avatar on world map. */ static void showOnMap(const LLUUID& id); diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp index c474f2885b..1e596624b9 100644 --- a/indra/newview/llcallbacklist.cpp +++ b/indra/newview/llcallbacklist.cpp @@ -70,33 +70,33 @@ void LLCallbackList::addFunction( callback_t func, void *data) } -BOOL LLCallbackList::containsFunction( callback_t func, void *data) +bool LLCallbackList::containsFunction( callback_t func, void *data) { callback_pair_t t(func, data); callback_list_t::iterator iter = std::find(mCallbackList.begin(), mCallbackList.end(), t); if (iter != mCallbackList.end()) { - return TRUE; + return true; } else { - return FALSE; + return false; } } -BOOL LLCallbackList::deleteFunction( callback_t func, void *data) +bool LLCallbackList::deleteFunction( callback_t func, void *data) { callback_pair_t t(func, data); callback_list_t::iterator iter = std::find(mCallbackList.begin(), mCallbackList.end(), t); if (iter != mCallbackList.end()) { mCallbackList.erase(iter); - return TRUE; + return true; } else { - return FALSE; + return false; } } diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 8617183840..d5b25deaf5 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -175,6 +175,49 @@ public: LLFloaterSidePanelContainer::showPanel("people", "panel_people", LLSD().with("people_panel_tab_name", "blocked_panel").with("blocked_to_select", getAvatarId())); } + else if (level == "report_abuse") + { + std::string time_string; + if (mTime > 0) // have frame time + { + 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") + "] [" + + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "]"; + + LLSD substitution; + + substitution["datetime"] = (S32)message_time; + LLStringUtil::format(time_string, substitution); + } + else + { + // From history. This might be empty or not full. + // See LLChatLogParser::parse + time_string = getChild<LLTextBox>("time_box")->getValue().asString(); + + // Just add current date if not full. + // Should be fine since both times are supposed to be SLT. + if (!time_string.empty() && time_string.size() < 7) + { + time_string = "[" + LLTrans::getString("TimeMonth") + "]/[" + + LLTrans::getString("TimeDay") + "]/[" + + LLTrans::getString("TimeYear") + "] " + time_string; + + LLSD substitution; + // To avoid adding today's date to yesterday's timestamp, + // use creation time instead of current time + substitution["datetime"] = (S32)mCreationTime; + LLStringUtil::format(time_string, substitution); + } + } + LLFloaterReporter::showFromChatObj(getAvatarId(), time_string, mText); + } else if (level == "unblock") { LLMuteList::getInstance()->remove(LLMute(getAvatarId(), mFrom, LLMute::OBJECT)); @@ -461,7 +504,7 @@ public: time_string = getChild<LLTextBox>("time_box")->getValue().asString(); // Just add current date if not full. - // Should be fine since both times are supposed to be stl + // Should be fine since both times are supposed to be SLT. if (!time_string.empty() && time_string.size() < 7) { time_string = "[" + LLTrans::getString("TimeMonth") + "]/[" @@ -475,7 +518,7 @@ public: LLStringUtil::format(time_string, substitution); } } - LLFloaterReporter::showFromChat(mAvatarID, mFrom, time_string, mText); + LLFloaterReporter::showFromChatAv(mAvatarID, mFrom, time_string, mText); } else if(level == "block_unblock") { diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 5ac4ce0d52..2e8fb752b8 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -35,8 +35,10 @@ #include "llcommandhandler.h" #include "llfloaterreg.h" #include "lllocalcliprect.h" +#include "llpanelblockedlist.h" #include "lltrans.h" #include "llfloaterimnearbychat.h" +#include "llfloaterreporter.h" #include "llfloaterworldmap.h" #include "llviewermenu.h" @@ -93,6 +95,32 @@ public: } return true; } + if (verb == "block") + { + if (params.size() > 2) + { + const std::string object_name = LLURI::unescape(params[2].asString()); + LLMute mute(object_id, object_name, LLMute::OBJECT); + LLMuteList::getInstance()->add(mute); + LLPanelBlockedList::showPanelAndSelect(mute.mID); + } + return true; + } + if (verb == "unblock") + { + if (params.size() > 2) + { + const std::string object_name = params[2].asString(); + LLMute mute(object_id, object_name, LLMute::OBJECT); + LLMuteList::getInstance()->remove(mute); + } + return true; + } + if (verb == "reportAbuse" && web == NULL) + { + LLFloaterReporter::showFromObject(object_id, LLUUID::null); + return true; + } return false; } diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 6bd15d4b61..f5d144dcc6 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -292,7 +292,8 @@ LLCOFWearables::LLCOFWearables() : LLPanel(), mBodyPartsTab(NULL), mLastSelectedTab(NULL), mAccordionCtrl(NULL), - mCOFVersion(-1) + mCOFVersion(-1), + mRefreshPending(false) { mClothingMenu = new CofClothingContextMenu(this); mAttachmentMenu = new CofAttachmentContextMenu(this); @@ -326,6 +327,10 @@ bool LLCOFWearables::postBuild() mClothing->setCommitOnSelectionChange(true); mBodyParts->setCommitOnSelectionChange(true); + mClothing->setReorderValidateCallback(boost::bind(&LLCOFWearables::canReorderClothing, this, _1, _2)); + mClothing->setReorderCallback(boost::bind(&LLCOFWearables::onClothingReordered, this, _1, _2)); + mClothing->setReorderEndedCallback(boost::bind(&LLCOFWearables::onReorderEnded, this)); + //clothing is sorted according to its position relatively to the body mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR); mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR); @@ -377,6 +382,50 @@ void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list) onCommit(); } +bool LLCOFWearables::canReorderClothing(const LLSD& dragged_value, const LLSD& neighbour_value) +{ + LLViewerInventoryItem* dragged = gInventory.getItem(dragged_value.asUUID()); + LLViewerInventoryItem* neighbour = gInventory.getItem(neighbour_value.asUUID()); + if (!dragged || !neighbour) return false; // reject placeholder/dummy rows + if (!dragged->isWearableType() || !neighbour->isWearableType()) return false; + + return dragged->getWearableType() == neighbour->getWearableType(); +} + +void LLCOFWearables::onClothingReordered(const LLSD& dragged_value, S32 /*new_index*/) +{ + LLViewerInventoryItem* item = gInventory.getItem(dragged_value.asUUID()); + if (!item || !item->isWearableType()) return; + + LLWearableType::EType type = item->getWearableType(); + + // Persist the affected type group's full order from the list's current order + // (furthest-to-closest), which covers both single- and multi-row drags. + uuid_vec_t ordered_link_ids; + std::vector<LLSD> values; + mClothing->getValues(values); + for (const LLSD& value : values) + { + LLViewerInventoryItem* other = gInventory.getItem(value.asUUID()); + if (!other || !other->isWearableType() || other->getWearableType() != type) continue; + + ordered_link_ids.push_back(value.asUUID()); + } + + if (ordered_link_ids.size() < 2) return; + + LLAppearanceMgr::getInstance()->reorderWearableGroup(type, ordered_link_ids); +} + +void LLCOFWearables::onReorderEnded() +{ + // Run a refresh that arrived (and was skipped) while the drag was active. + if (mRefreshPending) + { + refresh(); + } +} + void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded) { bool had_selected_items = mClothing->numSelected() || mAttachments->numSelected() || mBodyParts->numSelected(); @@ -401,6 +450,15 @@ void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expa void LLCOFWearables::refresh() { + // Don't rebuild mid-drag, clearing the list would cancel the active reorder. + // Remember it so onReorderEnded() can re-run the skipped refresh on release. + if (mClothing && mClothing->isReorderActive()) + { + mRefreshPending = true; + return; + } + mRefreshPending = false; + const LLUUID cof_id = LLAppearanceMgr::instance().getCOF(); if (cof_id.isNull()) { @@ -560,6 +618,12 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory item_panel->setShowMoveUpButton(!first); item_panel->setShowMoveDownButton(!last); + // hint that rows in a multi-layer group can be dragged to reorder + if (!(first && last)) + { + item_panel->setToolTip(LLTrans::getString("ReorderClothingTooltip")); + } + //setting callbacks //*TODO move that item panel's inner structure disclosing stuff into the panels item_panel->childSetAction("btn_delete", boost::bind(mCOFCallbacks.mDeleteWearable)); diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h index b349f35921..7d4d8917b4 100644 --- a/indra/newview/llcofwearables.h +++ b/indra/newview/llcofwearables.h @@ -102,6 +102,12 @@ protected: void onSelectionChange(LLFlatListView* selected_list); void onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded); + // Clothing drag-to-reorder: only allow moves within the same wearable type, + // and translate a drop into a layer-order change. + bool canReorderClothing(const LLSD& dragged_value, const LLSD& neighbour_value); + void onClothingReordered(const LLSD& dragged_value, S32 new_index); + void onReorderEnded(); + LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last); LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item); LLPanelDeletableWearableListItem* buildAttachemntListItem(LLViewerInventoryItem* item); @@ -132,6 +138,9 @@ protected: /* COF category version since last refresh */ S32 mCOFVersion; + + /* a refresh arrived mid-drag and was skipped; re-run it when the drag ends */ + bool mRefreshPending; }; diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index 0734b12531..7e7d528199 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -60,7 +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 = { "help", "set", "setdefault", "settings", "sessionsettings", "usersessionsettings" }; + const std::set<std::string> unmapped_options = { "help", "set", "setdefault", "settings", "sessionsettings", "usersessionsettings", "gpubenchmark" }; po::options_description gOptionsDesc; po::positional_options_description gPositionalOptions; @@ -611,6 +611,11 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value, ctrl->setValue(llsdArray, false); } + else if (ctrl->isType(TYPE_LLSD)) + { + // Command-line LLSD should support a notation format string + ctrl->setValueFromNotation(onevalue(option, value), false); + } else { ctrl->setValue(onevalue(option, value), false); diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index e0236ca618..ba19135fce 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -52,7 +52,6 @@ #include "lldir.h" #include "llnotificationsutil.h" #include "llviewerstats.h" -#include "llfilesystem.h" #include "lluictrlfactory.h" #include "lltrans.h" @@ -122,9 +121,9 @@ namespace class LLQueuedScriptAssetUpload : public LLScriptAssetUpload { public: - LLQueuedScriptAssetUpload(LLUUID taskId, LLUUID itemId, LLUUID assetId, TargetType_t targetType, + LLQueuedScriptAssetUpload(LLUUID taskId, LLUUID itemId, LLUUID assetId, std::string compileTarget, bool isRunning, std::string scriptName, LLUUID queueId, LLUUID exerienceId, taskUploadFinish_f finish) : - LLScriptAssetUpload(taskId, itemId, targetType, isRunning, + LLScriptAssetUpload(taskId, itemId, compileTarget, isRunning, exerienceId, std::string(), finish, nullptr), mScriptName(scriptName), mQueueId(queueId) @@ -183,9 +182,7 @@ struct LLScriptQueueData // Default constructor LLFloaterScriptQueue::LLFloaterScriptQueue(const LLSD& key) : - LLFloater(key), - mDone(false), - mMono(false) + LLFloater(key) { } @@ -197,7 +194,7 @@ LLFloaterScriptQueue::~LLFloaterScriptQueue() bool LLFloaterScriptQueue::postBuild() { - childSetAction("close",onCloseBtn,this); + childSetAction("close", onCloseBtn, this); getChildView("close")->setEnabled(false); setVisible(true); return true; @@ -222,8 +219,8 @@ bool LLFloaterScriptQueue::start() LLStringUtil::format_map_t args; args["[START]"] = mStartString; - args["[COUNT]"] = llformat ("%d", mObjectList.size()); - buffer = getString ("Starting", args); + args["[COUNT]"] = llformat("%d", mObjectList.size()); + buffer = getString("Starting", args); getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM); @@ -276,8 +273,8 @@ bool LLFloaterCompileQueue::hasExperience( const LLUUID& id ) const return mExperienceIds.find(id) != mExperienceIds.end(); } -// //Attempt to record this asset ID. If it can not be inserted into the set -// //then it has already been processed so return false. +// Attempt to record this asset ID. If it can not be inserted into the set +// then it has already been processed so return false. void LLFloaterCompileQueue::handleHTTPResponse(std::string pumpName, const LLSD &expresult) { @@ -359,7 +356,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat LLCheckedHandle<LLFloaterCompileQueue> floater(hfloater); // Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle. // which is caught in objectScriptProcessingQueueCoro - bool monocompile = floater->mMono; + std::string compile_target = floater->mCompileTarget; // Initial test to see if we can (or should) attempt to compile the script. LLInventoryItem *item = dynamic_cast<LLInventoryItem *>(inventory); @@ -464,13 +461,31 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat LLUUID assetId = result["asset_id"]; + const bool script_is_lua = item->getInventorySubType() == SST_LUA; + const bool target_is_lua = compile_target == "luau"; + const bool incompatible_language = target_is_lua != script_is_lua; + + // Lua and LSL use different source languages, so do not send an incompatible + // script to the compiler. The inventory subtype identifies the source language. + if (incompatible_language) + { + LLStringUtil::format_map_t args; + args["[SCRIPT_NAME]"] = inventory->getName(); + args["[TARGET]"] = compile_target; + std::string buffer = floater->getString("SkippingIncompatibleScript", args); + floater->addStringMessage(buffer); + LL_INFOS("SCRIPTQ") << "Skipping incompatible script: " << inventory->getName() + << " (target " << compile_target << ")" << LL_ENDL; + return true; + } + std::string url = object->getRegion()->getCapability("UpdateScriptTask"); { LLResourceUploadInfo::ptr_t uploadInfo = std::make_shared<LLQueuedScriptAssetUpload>(object->getID(), inventory->getUUID(), assetId, - monocompile ? LLScriptAssetUpload::MONO : LLScriptAssetUpload::LSL2, + compile_target, true, inventory->getName(), LLUUID(), diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h index bcbb166c58..8832d76ea4 100644 --- a/indra/newview/llcompilequeue.h +++ b/indra/newview/llcompilequeue.h @@ -55,7 +55,7 @@ public: /*virtual*/ bool postBuild(); - void setMono(bool mono) { mMono = mono; } + void setCompileTarget(std::string target) { mCompileTarget = target; } // addObject() accepts an object id. void addObject(const LLUUID& id, std::string name); @@ -80,8 +80,8 @@ protected: protected: // UI - LLScrollListCtrl* mMessages; - LLButton* mCloseBtn; + LLScrollListCtrl* mMessages { nullptr }; + LLButton* mCloseBtn { nullptr }; // Object Queue struct ObjectData @@ -93,14 +93,13 @@ protected: object_data_list_t mObjectList; LLUUID mCurrentObjectID; - bool mDone; + bool mDone { false }; std::string mStartString; - bool mMono; + std::string mCompileTarget { "lsl2" }; 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/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index 4a4985d8ac..bfcc2e4182 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -512,7 +512,7 @@ bool LLConversationLog::saveToFile(const std::string& filename) return false; } - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("wb")); if (!fp) { LL_WARNS() << "Couldn't open call log list" << filename << LL_ENDL; @@ -556,7 +556,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename) return false; } - LLFILE* fp = LLFile::fopen(filename, "rb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("rb")); if (!fp) { LL_WARNS() << "Couldn't open call log list" << filename << LL_ENDL; diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index fa8acac2ce..398b468b55 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -37,13 +37,12 @@ #include "llviewercontrol.h" #include "llwin32headers.h" -#if LL_LINUX || LL_DARWIN || __FreeBSD__ -# include "llfilepicker.h" +#if LL_SDL_WINDOW +#include "SDL3/SDL.h" #endif -#ifdef LL_FLTK - #include "FL/Fl.H" - #include "FL/Fl_Native_File_Chooser.H" +#if LL_LINUX || LL_DARWIN || __FreeBSD__ +# include "llfilepicker.h" #endif #if LL_WINDOWS @@ -70,7 +69,103 @@ bool LLDirPicker::check_local_file_access_enabled() return true; } -#if LL_WINDOWS +#if LL_SDL_WINDOW + +LLDirPicker::LLDirPicker() : + mFileName(NULL), + mLocked(false) +{ + reset(); +} + +LLDirPicker::~LLDirPicker() +{ +} + +void LLDirPicker::reset() +{ +} + +bool LLDirPicker::getDir(std::string* filename, bool blocking) +{ + return false; +} + +std::string LLDirPicker::getDirName() +{ + return {}; +} + +bool LLDirPicker::getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ + if (mLocked) + { + return false; + } + + // if local file browsing is turned off, return without opening dialog + if (!check_local_file_access_enabled()) + { + return false; + } + + { + struct LLSDLFileUserdata + { + LLSDLFileUserdata(void (*callback_func)(bool, std::string&, void*), void* callback_userdata) + : mCallback(callback_func), mUserdata(callback_userdata) + { + } + void (*mCallback)(bool, std::string&, void*); + void* mUserdata; + }; + + auto sdl_callback = [](void* userdata, const char* const* filelist, int filter) + { + LLSDLFileUserdata* callback_struct = (LLSDLFileUserdata*)userdata; + + auto* callback_func = callback_struct->mCallback; + auto* callback_data = callback_struct->mUserdata; + delete callback_struct; // delete callback container + + std::string rtn; + if (!filelist) + { + LL_WARNS() << "Error during SDL folder picking: " << SDL_GetError() << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + else if (!*filelist) + { + LL_INFOS() << "User did not select any folders. Dialog likely cancelled." << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + + while (*filelist) { + rtn = std::string(*filelist); + break; + } + callback_func(true, rtn, callback_data); + + }; + + LLSDLFileUserdata* llfilecallback = new LLSDLFileUserdata(callback, userdata); + + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, SDL_GL_GetCurrentWindow()); + SDL_ShowFileDialogWithProperties(SDL_FILEDIALOG_OPENFOLDER, sdl_callback, llfilecallback, props); + + SDL_DestroyProperties(props); + } + + return true; +} + + +#elif LL_WINDOWS LLDirPicker::LLDirPicker() : mFileName(NULL), @@ -172,6 +267,13 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) return success; } +bool LLDirPicker::getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ + return false; +} + std::string LLDirPicker::getDirName() { return mDir; @@ -200,7 +302,6 @@ void LLDirPicker::reset() } -//static bool LLDirPicker::getDir(std::string* filename, bool blocking) { LLFilePicker::ELoadFilter filter=LLFilePicker::FFLOAD_DIRECTORY; @@ -208,6 +309,13 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) return mFilePicker->getOpenFile(filter, true); } +bool LLDirPicker::getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ + return false; +} + std::string LLDirPicker::getDirName() { return mFilePicker->getFirstFile(); @@ -219,28 +327,20 @@ LLDirPicker::LLDirPicker() : mFileName(NULL), mLocked(false) { -#ifndef LL_FLTK mFilePicker = new LLFilePicker(); -#endif reset(); } LLDirPicker::~LLDirPicker() { -#ifndef LL_FLTK delete mFilePicker; -#endif } void LLDirPicker::reset() { -#ifndef LL_FLTK if (mFilePicker) mFilePicker->reset(); -#else - mDir = ""; -#endif } bool LLDirPicker::getDir(std::string* filename, bool blocking) @@ -253,39 +353,23 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) return false; } -#ifdef LL_FLTK - gViewerWindow->getWindow()->beforeDialog(); - Fl_Native_File_Chooser flDlg; - flDlg.title(LLTrans::getString("choose_the_directory").c_str()); - flDlg.type(Fl_Native_File_Chooser::BROWSE_DIRECTORY ); - int res = flDlg.show(); - gViewerWindow->getWindow()->afterDialog(); - if( res == 0 ) - { - char const *pDir = flDlg.filename(0); - if( pDir ) - mDir = pDir; - } - else if( res == -1 ) - { - LL_WARNS() << "FLTK failed: " << flDlg.errmsg() << LL_ENDL; - } - return !mDir.empty(); -#endif + return false; +} + +bool LLDirPicker::getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ return false; } std::string LLDirPicker::getDirName() { -#ifndef LL_FLTK if (mFilePicker) { return mFilePicker->getFirstFile(); } return ""; -#else - return mDir; -#endif } #else // not implemented @@ -309,6 +393,13 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) return false; } +bool LLDirPicker::getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ + return false; +} + std::string LLDirPicker::getDirName() { return ""; @@ -322,7 +413,9 @@ std::queue<LLDirPickerThread*> LLDirPickerThread::sDeadQ; void LLDirPickerThread::getFile() { -#if LL_WINDOWS +#if LL_SDL_WINDOW + runModeless(); +#elif LL_WINDOWS start(); #else run(); @@ -352,6 +445,32 @@ void LLDirPickerThread::run() } +void LLDirPickerThread::runModeless() +{ + LLDirPicker picker; + bool result = picker.getDirModeless(&mProposedName, modelessStringCallback, this); + if (!result) + { + LLMutexLock lock(sMutex); + sDeadQ.push(this); + } +} + +void LLDirPickerThread::modelessStringCallback(bool success, + std::string& response, + void* user_data) +{ + LLDirPickerThread* picker = (LLDirPickerThread*)user_data; + { + LLMutexLock lock(sMutex); + if (success) + { + picker->mResponses.push_back(response); + } + sDeadQ.push(picker); + } +} + //static void LLDirPickerThread::initClass() { diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h index 4bbe7db144..a64ea7fac9 100644 --- a/indra/newview/lldirpicker.h +++ b/indra/newview/lldirpicker.h @@ -58,6 +58,9 @@ class LLDirPicker { public: bool getDir(std::string* filename, bool blocking = true); + bool getDirModeless(std::string* filename, + void (*callback)(bool, std::string&, void*), + void* userdata); std::string getDirName(); // clear any lists of buffers or whatever, and make sure the dir @@ -77,10 +80,8 @@ private: #if LL_LINUX || LL_DARWIN || __FreeBSD__ // On Linux we just implement LLDirPicker on top of LLFilePicker -#ifndef LL_FLTK LLFilePicker *mFilePicker; #endif -#endif std::string* mFileName; @@ -118,6 +119,11 @@ public: virtual void run(); + void runModeless(); + static void modelessStringCallback(bool success, + std::string& response, + void* user_data); + virtual void notify(const std::vector<std::string>& filenames); private: diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index da9378ad12..18123e07a8 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -664,10 +664,15 @@ F32 LLDrawable::updateXform(bool undamped) // snap to final position (only if no target omega is applied) dist_squared = 0.0f; //set target scale here, because of dist_squared = 0.0f remove object from move list - mCurrentScale = target_scale; - - if (getVOVolume() && !isRoot()) - { //child prim snapping to some position, needs a rebuild + if (mCurrentScale != target_scale) + { + mCurrentScale = target_scale; + // Final scale change needs a rebuild + gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION); + } + else if (getVOVolume() && !isRoot()) + { + //child prim snapping to some position, needs a rebuild gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION); } } diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 6f6faf9909..8af044990f 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -59,8 +59,7 @@ class LLViewerTexture; const U32 SILHOUETTE_HIGHLIGHT = 0; // All data for new renderer goes into this class. -LL_ALIGN_PREFIX(16) -class LLDrawable +class alignas(16) LLDrawable : public LLViewerOctreeEntryData { LL_ALIGN_NEW; @@ -304,7 +303,7 @@ private: static U32 sNumZombieDrawables; static std::vector<LLPointer<LLDrawable> > sDeadList; -} LL_ALIGN_POSTFIX(16); +}; inline LLFace* LLDrawable::getFace(const S32 i) const diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 325c3f9b94..f5a93a4804 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -369,9 +369,7 @@ void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color) void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color) { -#if GL_VERSION_1_1 - glColor4ubv(color.mV); -#endif + gGL.diffuseColor4ubv(color.mV); } void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a) @@ -442,7 +440,11 @@ void LLRenderPass::pushBatches(U32 type, bool texture, bool batch_textures) LLDrawInfo* pparams = *i; LLCullResult::increment_iterator(i, end); - pushBatch(*pparams, texture, batch_textures); + llassert(pparams); // figure out how null got here, it shouldn't be happening + if (pparams) + { + pushBatch(*pparams, texture, batch_textures); + } } } else @@ -461,7 +463,10 @@ void LLRenderPass::pushUntexturedBatches(U32 type) LLDrawInfo* pparams = *i; LLCullResult::increment_iterator(i, end); - pushUntexturedBatch(*pparams); + if (pparams) + { + pushUntexturedBatch(*pparams); + } } } @@ -481,7 +486,7 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures LLDrawInfo* pparams = *i; LLCullResult::increment_iterator(i, end); - if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) + if (pparams && uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) { pushBatch(*pparams, texture, batch_textures); } @@ -506,7 +511,7 @@ void LLRenderPass::pushUntexturedRiggedBatches(U32 type) LLDrawInfo* pparams = *i; LLCullResult::increment_iterator(i, end); - if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) + if (pparams && uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) { pushUntexturedBatch(*pparams); } @@ -522,8 +527,11 @@ void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures) { LLDrawInfo* pparams = *i; LLCullResult::increment_iterator(i, end); - LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); - pushBatch(*pparams, texture, batch_textures); + if (pparams) + { + LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); + pushBatch(*pparams, texture, batch_textures); + } } } @@ -541,13 +549,16 @@ void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_text LLCullResult::increment_iterator(i, end); - llassert(pparams); - - LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); + llassert(pparams); // figure out how null got here, it shouldn't be happening - if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) + if (pparams) { - pushBatch(*pparams, texture, batch_textures); + LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); + + if (uploadMatrixPalette(pparams->mAvatar, pparams->mSkinInfo, lastAvatar, lastMeshId, skipLastSkin)) + { + pushBatch(*pparams, texture, batch_textures); + } } } } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 9d1b11880b..8755120920 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -267,8 +267,8 @@ void LLDrawPoolAlpha::forwardRender(bool rigged) gGL.setColorMask(true, false); - if (!rigged && getType() == LLDrawPoolAlpha::POOL_ALPHA_POST_WATER) - { //render "highlight alpha" on final non-rigged pass + if (!rigged && (LLPipeline::sRenderingHUDs || getType() == LLDrawPoolAlpha::POOL_ALPHA_POST_WATER)) + { //render "highlight alpha" on final non-rigged pass for non-HUDs (HUDs only run pre-water alpha pass) // NOTE -- hacky call here protected by !rigged instead of alongside "forwardRender" // so renderDebugAlpha is executed while gls_pipeline_alpha and depth GL state // variables above are still in scope @@ -278,7 +278,7 @@ void LLDrawPoolAlpha::forwardRender(bool rigged) void LLDrawPoolAlpha::renderDebugAlpha() { - if (sShowDebugAlpha && !gCubeSnapshot) + if (sShowDebugAlpha && !gCubeSnapshot && !LLPipeline::sReflectionRender) { gHighlightProgram.bind(); gGL.diffuseColor4f(1, 0, 0, 1); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index f0f589e7f4..9386206e76 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -595,7 +595,15 @@ void LLDrawPoolAvatar::beginSkinned() { LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - // used for preview only + // Used for preview only, like LLVisualParamHint + // Uses deprecated logic!!! + if (!gAvatarProgram.isComplete()) + { + llassert(false); // Avatar shader shouldn't have failed if deferred shader loaded + sVertexProgram = nullptr; + LLGLSLShader::unbind(); + return; + } sVertexProgram = &gAvatarProgram; @@ -603,31 +611,26 @@ void LLDrawPoolAvatar::beginSkinned() sVertexProgram->bind(); sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); + sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); } void LLDrawPoolAvatar::endSkinned() { LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - if (sShaderLevel > 0) - { - sRenderingSkinned = false; - sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP); - gGL.getTexUnit(0)->activate(); - sVertexProgram->unbind(); - sShaderLevel = mShaderLevel; - } - else + if (sVertexProgram == nullptr) { - if(gPipeline.shadersLoaded()) - { - // software skinning, use a basic shader for windlight. - // TODO: find a better fallback method for software skinning. - sVertexProgram->unbind(); - } + return; } + // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done + sRenderingSkinned = false; + sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); + sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP); + gGL.getTexUnit(0)->activate(); + sVertexProgram->unbind(); + sShaderLevel = mShaderLevel; + gGL.getTexUnit(0)->activate(); } diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 1affef18db..9ec5b9ee68 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -114,7 +114,7 @@ void LLStandardBumpmap::addstandard() gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount++] = LLStandardBumpmap("Darkness"); // BE_DARKNESS std::string file_name = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "std_bump.ini" ); - LLFILE* file = LLFile::fopen( file_name, "rt" ); /*Flawfinder: ignore*/ + LLFILE* file = LLFile::fopen( file_name, LLFILE_MODE("rt") ); /*Flawfinder: ignore*/ if( !file ) { LL_WARNS() << "Could not open std_bump <" << file_name << ">" << LL_ENDL; diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 2f4f47df6f..d75b8d0ac6 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -636,405 +636,6 @@ void LLDrawPoolTerrain::hilightParcelOwners() } -void LLDrawPoolTerrain::renderFull4TU() -{ - // Hack! Get the region that this draw pool is rendering from! - LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); - LLVLComposition *compp = regionp->getComposition(); - LLViewerTexture *detail_texture0p = compp->mDetailTextures[0]; - LLViewerTexture *detail_texture1p = compp->mDetailTextures[1]; - LLViewerTexture *detail_texture2p = compp->mDetailTextures[2]; - LLViewerTexture *detail_texture3p = compp->mDetailTextures[3]; - - LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal(); - F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale; - F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale; - - LLVector4 tp0, tp1; - - tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x); - tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y); - - gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA); - - //---------------------------------------------------------------------------- - // Pass 1/1 - - // - // Stage 0: detail texture 0 - // - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->bind(detail_texture0p); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - // - // Stage 1: Generate alpha ramp for detail0/detail1 transition - // - - gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get()); - gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->activate(); - - // - // Stage 2: Interpolate detail1 with existing based on ramp - // - gGL.getTexUnit(2)->bind(detail_texture1p); - gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(2)->activate(); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - // - // Stage 3: Modulate with primary (vertex) color for lighting - // - gGL.getTexUnit(3)->bind(detail_texture1p); - gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(3)->activate(); - - gGL.getTexUnit(0)->activate(); - - // GL_BLEND disabled by default - drawLoop(); - - //---------------------------------------------------------------------------- - // Second pass - - // Stage 0: Write detail3 into base - // - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->bind(detail_texture3p); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - // - // Stage 1: Generate alpha ramp for detail2/detail3 transition - // - gGL.getTexUnit(1)->bind(m2DAlphaRampImagep); - gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->activate(); - - // Set the texture matrix - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.translatef(-2.f, 0.f, 0.f); - - // - // Stage 2: Interpolate detail2 with existing based on ramp - // - gGL.getTexUnit(2)->bind(detail_texture2p); - gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(2)->activate(); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - // - // Stage 3: Generate alpha ramp for detail1/detail2 transition - // - gGL.getTexUnit(3)->bind(m2DAlphaRampImagep); - gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(3)->activate(); - - // Set the texture matrix - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.translatef(-1.f, 0.f, 0.f); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - gGL.getTexUnit(0)->activate(); - { - LLGLEnable blend(GL_BLEND); - drawLoop(); - } - - LLVertexBuffer::unbind(); - // Disable multitexture - gGL.getTexUnit(3)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(3)->disable(); - gGL.getTexUnit(3)->activate(); - - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(2)->disable(); - gGL.getTexUnit(2)->activate(); - -#if GL_VERSION_1_1 - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); -#endif - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->disable(); - gGL.getTexUnit(1)->activate(); - - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - // Restore blend state - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - //---------------------------------------------------------------------------- - // Restore Texture Unit 0 defaults - - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - -#if GL_VERSION_1_1 - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); -#endif - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); -} - -void LLDrawPoolTerrain::renderFull2TU() -{ - // Hack! Get the region that this draw pool is rendering from! - LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion(); - LLVLComposition *compp = regionp->getComposition(); - LLViewerTexture *detail_texture0p = compp->mDetailTextures[0]; - LLViewerTexture *detail_texture1p = compp->mDetailTextures[1]; - LLViewerTexture *detail_texture2p = compp->mDetailTextures[2]; - LLViewerTexture *detail_texture3p = compp->mDetailTextures[3]; - - LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal(); - F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale; - F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale; - - LLVector4 tp0, tp1; - - tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x); - tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y); - - gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA); - - //---------------------------------------------------------------------------- - // Pass 1/4 - - // - // Stage 0: Render detail 0 into base - // - gGL.getTexUnit(0)->bind(detail_texture0p); -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - drawLoop(); - - //---------------------------------------------------------------------------- - // Pass 2/4 - - // - // Stage 0: Generate alpha ramp for detail0/detail1 transition - // - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); - -#if GL_VERSION_1_1 - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); -#endif - - // - // Stage 1: Write detail1 - // - gGL.getTexUnit(1)->bind(detail_texture1p); - gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->activate(); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - gGL.getTexUnit(0)->activate(); - { - LLGLEnable blend(GL_BLEND); - drawLoop(); - } - //---------------------------------------------------------------------------- - // Pass 3/4 - - // - // Stage 0: Generate alpha ramp for detail1/detail2 transition - // - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); - - // Set the texture matrix - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.translatef(-1.f, 0.f, 0.f); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - // - // Stage 1: Write detail2 - // - gGL.getTexUnit(1)->bind(detail_texture2p); - gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->activate(); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - { - LLGLEnable blend(GL_BLEND); - drawLoop(); - } - - //---------------------------------------------------------------------------- - // Pass 4/4 - - // - // Stage 0: Generate alpha ramp for detail2/detail3 transition - // - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->bind(m2DAlphaRampImagep); - // Set the texture matrix - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.translatef(-2.f, 0.f, 0.f); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - // Stage 1: Write detail3 - gGL.getTexUnit(1)->bind(detail_texture3p); - gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->activate(); - -#if GL_VERSION_1_1 - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); - glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV); - glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -#endif - - gGL.getTexUnit(0)->activate(); - { - LLGLEnable blend(GL_BLEND); - drawLoop(); - } - - // Restore blend state - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - // Disable multitexture - - gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(1)->disable(); - gGL.getTexUnit(1)->activate(); - -#if GL_VERSION_1_1 - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); -#endif - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - - //---------------------------------------------------------------------------- - // Restore Texture Unit 0 defaults - - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -#if GL_VERSION_1_1 - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); -#endif - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); -} - - -void LLDrawPoolTerrain::renderSimple() -{ - LLVector4 tp0, tp1; - - //---------------------------------------------------------------------------- - // Pass 1/1 - - // Stage 0: Base terrain texture pass - mTexturep->addTextureStats(1024.f*1024.f); - - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->bind(mTexturep); - - LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent(); - F32 tscale = 1.f/256.f; - tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f)); - tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f)); - - sShader->uniform4fv(LLShaderMgr::OBJECT_PLANE_S, 1, tp0.mV); - sShader->uniform4fv(LLShaderMgr::OBJECT_PLANE_T, 1, tp1.mV); - - drawLoop(); - - //---------------------------------------------------------------------------- - // Restore Texture Unit 0 defaults - - gGL.getTexUnit(0)->activate(); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.matrixMode(LLRender::MM_TEXTURE); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); -} - //============================================================================ void LLDrawPoolTerrain::renderOwnership() diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 23cf253b6a..49fccc168f 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -73,11 +73,8 @@ public: protected: void boostTerrainDetailTextures(); - void renderSimple(); void renderOwnership(); - void renderFull2TU(); - void renderFull4TU(); void renderFullShader(); void renderFullShaderTextures(); void renderFullShaderPBR(bool use_local_materials = false); diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h index 375828fefa..cc5e39c5fb 100644 --- a/indra/newview/lldynamictexture.h +++ b/indra/newview/lldynamictexture.h @@ -33,7 +33,7 @@ #include "llviewertexture.h" #include "llcamera.h" -class LLViewerDynamicTexture : public LLViewerTexture +class alignas(16) LLViewerDynamicTexture : public LLViewerTexture { LL_ALIGN_NEW public: @@ -90,7 +90,7 @@ protected: protected: bool mClamp; LLCoordGL mOrigin; - LL_ALIGN_16(LLCamera mCamera); + LLCamera mCamera; LLRenderTarget* mBoundTarget; diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 2a9295129d..be96b7680f 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -47,7 +47,7 @@ struct LLEventInfo std::string mSimName; LLVector3d mPosGlobal; F64 mUnixTime; // seconds from 1970 - BOOL mHasCover; + bool mHasCover; U32 mCover; U32 mEventFlags; }; diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index 9eddec55c5..836ff63429 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -331,26 +331,51 @@ namespace Details { // 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. + // pass a prepared name and copy the body 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]() + // Create a deep copy using binary serialization + try { - handleMessage(msg_name, body); - }; + std::stringstream body_stream; + LLSDSerialize::toBinary((*i)["body"], body_stream); + std::string body_str = body_stream.str(); + (*i)["body"].clear(); + work = [this, msg_name, body_str]() + { + try + { + LLSD body; + std::istringstream istr(body_str); + LLSDSerialize::fromBinary(body, istr, body_str.size()); + handleMessage(msg_name, body); + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS("LLCoros") << "Bad memory allocation in handleMessage() for " << msg_name << LL_ENDL; + } + }; + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS("LLCoros") << "Bad memory allocation in eventPollCoro for " << msg_name << LL_ENDL; + } } main_queue->post(work); } else { - handleMessage(*i); + try + { + handleMessage(*i); + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS("LLCoros") << "Bad memory allocation in handleMessage() for " << (*i)["message"].asString() << LL_ENDL; + } } } } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 20cc89b7bd..ccb7719b1e 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); + //gGL.setLineWidth(5.f); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 68443dfc5b..45d173f356 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -259,7 +259,6 @@ bool LLFeatureManager::loadFeatureTables() // *TODO - if I or anyone else adds something else to the skipped list // make this data driven. Put it in the feature table and parse it // correctly - mSkippedFeatures.insert("RenderAnisotropic"); mSkippedFeatures.insert("RenderGamma"); mSkippedFeatures.insert("RenderVBOEnable"); mSkippedFeatures.insert("RenderFogRatio"); @@ -378,6 +377,83 @@ F32 gpu_benchmark(); #if LL_WINDOWS +bool gGPUBenchmarkMode = false; + +// Runs gpu_benchmark() in a subprocess (exe with --gpubenchmark). +static F32 subprocess_gpu_benchmark() +{ + LLProcess::Params params; + params.executable = gDirUtilp->getExecutablePathAndName(); + params.args.add("--gpubenchmark"); + params.desc = "GPU benchmark"; + params.autokill = true; // killed via job object if parent crashes + params.attached = true; // killed on LLProcessPtr destruction (timeout) + params.files.add(LLProcess::FileParam()); // stdin: default + params.files.add(LLProcess::FileParam().type("pipe")); // stdout: pipe + params.files.add(LLProcess::FileParam()); // stderr: default + + LLProcessPtr child; + try + { + child = LLProcess::create(params); + } + catch (const std::exception& e) + { + LL_WARNS("RenderInit") << "subprocess_gpu_benchmark: failed to launch: " + << e.what() << LL_ENDL; + return -1.f; + } + + if (!child) + { + LL_WARNS("RenderInit") << "subprocess_gpu_benchmark: LLProcess::create returned null." << LL_ENDL; + return -1.f; + } + + LLProcess::ReadPipe& out = child->getReadPipe(LLProcess::STDOUT); + + const F32 POLL_INTERVAL_S = 0.25f; + const F32 TOTAL_TIMEOUT_S = 120.f; // covers full viewer init + benchmark + LLTimer timer; + timer.start(); + + while (timer.getElapsedTimeF32() < TOTAL_TIMEOUT_S) + { + child->pump(); + + // Result is a single float followed by '\n' + if (out.contains('\n')) + { + std::string line = out.getline(); + float parsed = 0.f; + if (sscanf_s(line.c_str(), "%f", &parsed) == 1 && parsed > 0.f) + { + LL_INFOS("RenderInit") << "subprocess_gpu_benchmark: result = " + << parsed << " GB/sec" << LL_ENDL; + // Let LLProcessPtr destructor handle cleanup + return parsed; + } + LL_WARNS("RenderInit") << "subprocess_gpu_benchmark: unparseable output: '" + << line << "'" << LL_ENDL; + return -1.f; + } + + // If child already exited without writing anything, bail + if (!child->isRunning()) + { + LL_WARNS("RenderInit") << "subprocess_gpu_benchmark: process exited without result." << LL_ENDL; + return -1.f; + } + + ms_sleep((U32)(POLL_INTERVAL_S * 1000)); + } + + // Timeout: attached=true means LLProcessPtr destructor kills it + LL_WARNS("RenderInit") << "GPU benchmark subprocess timed out after " + << (int)TOTAL_TIMEOUT_S << " seconds; killing." << LL_ENDL; + return -1.f; +} + F32 logExceptionBenchmark() { // FIXME: gpu_benchmark uses many C++ classes on the stack to control state. @@ -458,7 +534,27 @@ bool LLFeatureManager::loadGPUClass() try { #if LL_WINDOWS - gbps = logExceptionBenchmark(); + if (gGPUBenchmarkMode) + { + // We ARE the benchmark subprocess; run directly in-process. + // logExceptionBenchmark wraps with SEH so structured exceptions + // (e.g. access violations inside the driver) are still caught. + gbps = logExceptionBenchmark(); + } + else + { + // Normal path: run benchmark in an isolated subprocess so a + // driver hang can be killed without freezing the main viewer. + gbps = subprocess_gpu_benchmark(); + if (gbps == -1.f + && gGLManager.getRawGLString().find("Radeon") != std::string::npos + && checkRDNA35()) + { + // Certain AMD GPUs have known issues with shader profiling and occlusion queries that can lead to hangs. + // If test returned -1, we are likely on a bad driver. + gSavedSettings.setBOOL("UseOcclusion", false); + } + } #else gbps = gpu_benchmark(); #endif @@ -469,6 +565,21 @@ bool LLFeatureManager::loadGPUClass() LL_WARNS("RenderInit") << "GPU benchmark failed: " << e.what() << LL_ENDL; } +#if LL_WINDOWS + // If we are the benchmark subprocess, write the raw result to stdout + // so the parent process can read it, then exit immediately. + if (gGPUBenchmarkMode) + { + LL_WARNS("RenderInit") << "Passing " << gbps << " to parent" << LL_ENDL; + char buf[64]; + int len = snprintf(buf, sizeof(buf), "%.6f\n", gbps); + DWORD written = 0; + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buf, (DWORD)len, &written, NULL); + FlushFileBuffers(GetStdHandle(STD_OUTPUT_HANDLE)); + ExitProcess(0); + } +#endif + mGPUMemoryBandwidth = gbps; // bias by CPU speed @@ -510,17 +621,16 @@ bool LLFeatureManager::loadGPUClass() mGPUClass = GPU_CLASS_5; } - #if LL_WINDOWS - const F32Gigabytes MIN_PHYSICAL_MEMORY(8); - LLMemory::updateMemoryInfo(); + #if LL_WINDOWS || LL_LINUX + const F32Gigabytes MIN_PHYSICAL_MEMORY(8); F32Gigabytes physical_mem = LLMemory::getMaxMemKB(); if (MIN_PHYSICAL_MEMORY > physical_mem && mGPUClass > GPU_CLASS_1) { // reduce quality on systems that don't have enough memory mGPUClass = (EGPUClass)(mGPUClass - 1); } - #endif //LL_WINDOWS + #endif //LL_WINDOWS || LL_LINUX } //end if benchmark else { @@ -756,6 +866,10 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("VRAMLT2GB"); } + if (!gGLManager.mHasAnisotropic || 2.f > gGLManager.mMaxAnisotropy) + { + maskFeatures("AnisotropicMissing"); + } if (gGLManager.mGLVersion < 3.99f) { maskFeatures("GL3"); diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index d26a3784a2..d4790eec55 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -36,15 +36,10 @@ #include "llviewercontrol.h" #include "llwindow.h" // beforeDialog() -#if LL_SDL +#if LL_SDL_WINDOW #include "llwindowsdl.h" // for some X/GTK utils to help with filepickers #endif // LL_SDL -#ifdef LL_FLTK - #include "FL/Fl.H" - #include "FL/Fl_Native_File_Chooser.H" -#endif - #if LL_LINUX || __FreeBSD__ #include "llhttpconstants.h" // file picker uses some of thes constants on Linux #endif @@ -55,7 +50,7 @@ LLFilePicker LLFilePicker::sInstance; -#if LL_WINDOWS +#if LL_WINDOWS && !LL_SDL_WINDOW #define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0" #define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" #define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0" @@ -68,7 +63,7 @@ LLFilePicker LLFilePicker::sInstance; #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" -#define SCRIPT_FILTER L"Script files (*.lsl)\0*.lsl\0" +#define SCRIPT_FILTER L"Script files (*.lsl; *.lua; *.luau)\0*.lsl;*.lua;*.luau\0" #define DICTIONARY_FILTER L"Dictionary files (*.dic; *.xcu)\0*.dic;*.xcu\0" #endif @@ -87,7 +82,7 @@ LLFilePicker::LLFilePicker() { reset(); -#if LL_WINDOWS +#if LL_WINDOWS && !LL_SDL_WINDOW mOFN.lStructSize = sizeof(OPENFILENAMEW); mOFN.hwndOwner = NULL; // Set later mOFN.hInstance = NULL; @@ -107,7 +102,7 @@ LLFilePicker::LLFilePicker() mOFN.lpfnHook = NULL; mOFN.lpTemplateName = NULL; mFilesW[0] = '\0'; -#elif LL_DARWIN +#elif LL_DARWIN && !LL_SDL_WINDOW mPickOptions = 0; #endif @@ -172,7 +167,453 @@ void LLFilePicker::reset() mCurrentFile = 0; } -#if LL_WINDOWS +#if LL_SDL_WINDOW + +namespace +{ + std::vector<SDL_DialogFileFilter> setupLoadFilter(LLFilePicker::ELoadFilter filter) + { + std::vector<SDL_DialogFileFilter> filter_vec; + + switch (filter) + { + case LLFilePicker::FFLOAD_ALL: + case LLFilePicker::FFLOAD_EXE: + filter_vec.push_back({ "All Files (*.*)", "*" }); + filter_vec.push_back({ "Sounds (*.wav)", "wav" }); + filter_vec.push_back({ "Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)", "tga;bmp;jpg;jpeg;png" }); + filter_vec.push_back({ "Animations (*.bvh; *.anim)", "bvh;anim" }); + filter_vec.push_back({ "GLTF Files (*.gltf; *.glb)", "gltf;glb" }); + break; + case LLFilePicker::FFLOAD_WAV: + filter_vec.push_back({ "Sounds (*.wav)", "wav" }); + break; + case LLFilePicker::FFLOAD_IMAGE: + filter_vec.push_back({ "Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)", "tga;bmp;jpg;jpeg;png" }); + break; + case LLFilePicker::FFLOAD_ANIM: + filter_vec.push_back({ "Animations (*.bvh; *.anim)", "bvh;anim" }); + break; + case LLFilePicker::FFLOAD_GLTF: + filter_vec.push_back({ "glTF (*.gltf; *.glb)", "gltf;glb" }); + break; + case LLFilePicker::FFLOAD_COLLADA: + filter_vec.push_back({ "Scene (*.dae)", "dae" }); + break; + case LLFilePicker::FFLOAD_XML: + filter_vec.push_back({ "XML files (*.xml)", "xml" }); + break; + case LLFilePicker::FFLOAD_SLOBJECT: + filter_vec.push_back({ "Objects (*.slobject)", "slobject" }); + break; + case LLFilePicker::FFLOAD_RAW: + filter_vec.push_back({ "RAW files (*.raw)", "raw" }); + break; + case LLFilePicker::FFLOAD_MODEL: + filter_vec.push_back({ "Model files (*.dae; *.gltf; *.glb)", "dae;gltf;glb" }); + filter_vec.push_back({ "Collada files (*.dae)", "dae" }); + filter_vec.push_back({ "GLTF Files (*.gltf; *.glb)", "gltf;glb" }); + break; + case LLFilePicker::FFLOAD_MATERIAL: + filter_vec.push_back({ "GLTF Files (*.gltf; *.glb)", "gltf;glb" }); + break; + case LLFilePicker::FFLOAD_MATERIAL_TEXTURE: + filter_vec.push_back({ "GLTF Import (*.gltf; *.glb; *.tga; *.bmp; *.jpg; *.jpeg; *.png)", "gltf;glb;tga;bmp;jpg;jpeg;png" }); + filter_vec.push_back({ "GLTF Files (*.gltf; *.glb)", "gltf;glb" }); + filter_vec.push_back({ "Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)", "tga;bmp;jpg;jpeg;png" }); + break; + case LLFilePicker::FFLOAD_HDRI: + filter_vec.push_back({ "HDRI Files (*.exr)", "exr" }); + break; + case LLFilePicker::FFLOAD_SCRIPT: + filter_vec.push_back({ "Script files (*.lsl; *.lua; *.luau)", "lsl;lua;luau" }); + break; + case LLFilePicker::FFLOAD_DICTIONARY: + filter_vec.push_back({ "Dictionary files (*.dic; *.xcu)", "dic;xcu" }); + break; + default: + break; + } + return filter_vec; + } +} + +bool LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking) +{ + LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; + return false; +} + +bool LLFilePicker::getOpenFileModeless(ELoadFilter filter, + void (*callback)(bool, std::vector<std::string>&, void*), + void* userdata) +{ + if (mLocked) + { + return false; + } + + // if local file browsing is turned off, return without opening dialog + if (!check_local_file_access_enabled()) + { + return false; + } + + auto file_filters = setupLoadFilter(filter); + + reset(); + + { + struct LLSDLFileUserdata + { + LLSDLFileUserdata(void (*callback_func)(bool, std::vector<std::string>&, void*), void* callback_userdata) + : mCallback(callback_func), mUserdata(callback_userdata) + { + } + void (*mCallback)(bool, std::vector<std::string>&, void*); + void* mUserdata; + }; + + auto sdl_callback = [](void* userdata, const char* const* filelist, int filter) + { + LLSDLFileUserdata* callback_struct = (LLSDLFileUserdata*)userdata; + + auto* callback_func = callback_struct->mCallback; + auto* callback_data = callback_struct->mUserdata; + delete callback_struct; // delete callback container + + std::vector<std::string> rtn; + + if (!filelist) + { + LL_WARNS() << "Error during SDL file picking: " << SDL_GetError() << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + else if (!*filelist) + { + LL_INFOS() << "User did not select any file. Dialog likely cancelled." << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + + while (*filelist) + { + rtn.push_back(std::string(*filelist)); + filelist++; + } + + callback_func(true, rtn, callback_data); + + }; + + LLSDLFileUserdata* llfilecallback = new LLSDLFileUserdata(callback, userdata); + + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_FILTERS_POINTER, file_filters.data()); + SDL_SetNumberProperty(props, SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER, file_filters.size()); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, SDL_GL_GetCurrentWindow()); + SDL_SetBooleanProperty(props, SDL_PROP_FILE_DIALOG_MANY_BOOLEAN, false); + + SDL_ShowFileDialogWithProperties(SDL_FILEDIALOG_OPENFILE, sdl_callback, llfilecallback, props); + + SDL_DestroyProperties(props); + } + return true; +} + +bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking) +{ + LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; + return false; +} + +bool LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter, + void (*callback)(bool, std::vector<std::string>&, void*), + void* userdata) +{ + if (mLocked) + { + return false; + } + + // if local file browsing is turned off, return without opening dialog + if (!check_local_file_access_enabled()) + { + return false; + } + + auto file_filters = setupLoadFilter(filter); + + reset(); + + { + struct LLSDLFileUserdata + { + LLSDLFileUserdata(void (*callback_func)(bool, std::vector<std::string>&, void*), void* callback_userdata) + : mCallback(callback_func), mUserdata(callback_userdata) + { + } + void (*mCallback)(bool, std::vector<std::string>&, void*); + void* mUserdata; + }; + + auto sdl_callback = [](void* userdata, const char* const* filelist, int filter) + { + LLSDLFileUserdata* callback_struct = (LLSDLFileUserdata*)userdata; + + auto* callback_func = callback_struct->mCallback; + auto* callback_data = callback_struct->mUserdata; + delete callback_struct; // delete callback container + + std::vector<std::string> rtn; + + if (!filelist) + { + LL_WARNS() << "Error during SDL file picking: " << SDL_GetError() << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + else if (!*filelist) + { + LL_INFOS() << "User did not select any file. Dialog likely cancelled." << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + + while (*filelist) + { + rtn.push_back(std::string(*filelist)); + filelist++; + } + + callback_func(true, rtn, callback_data); + + }; + + LLSDLFileUserdata* llfilecallback = new LLSDLFileUserdata(callback, userdata); + + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_FILTERS_POINTER, file_filters.data()); + SDL_SetNumberProperty(props, SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER, file_filters.size()); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, SDL_GL_GetCurrentWindow()); + SDL_SetBooleanProperty(props, SDL_PROP_FILE_DIALOG_MANY_BOOLEAN, true); + + SDL_ShowFileDialogWithProperties(SDL_FILEDIALOG_OPENFILE, sdl_callback, llfilecallback, props); + + SDL_DestroyProperties(props); + } + + return true; +} + +bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking) +{ + LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; + return false; +} + +bool LLFilePicker::getSaveFileModeless(ESaveFilter filter, + const std::string& filename, + void (*callback)(bool, std::string&, void*), + void* userdata) +{ + if (mLocked) + { + return false; + } + + // if local file browsing is turned off, return without opening dialog + if (!check_local_file_access_enabled()) + { + return false; + } + + std::string default_filename; + if (!filename.empty()) + { + default_filename = filename; + } + + std::vector<SDL_DialogFileFilter> file_filters; + + switch (filter) + { + case FFSAVE_ALL: + file_filters.push_back({ "All Files (*.*)", "*" }); + file_filters.push_back({ "WAV Sounds (*.wav)", "wav" }); + file_filters.push_back({ "Targa, Bitmap Images (*.tga; *.bmp)", "tga;bmp" }); + break; + case FFSAVE_WAV: + if (default_filename.empty()) + { + default_filename = "untitled.wav"; + } + file_filters.push_back({ "WAV Sounds (*.wav)", "wav" }); + break; + case FFSAVE_TGA: + if (default_filename.empty()) + { + default_filename = "untitled.tga"; + } + file_filters.push_back({ "Targa Images (*.tga)", "tga" }); + break; + case FFSAVE_BMP: + if (default_filename.empty()) + { + default_filename = "untitled.bmp"; + } + file_filters.push_back({ "Bitmap Images (*.bmp)", "bmp" }); + break; + case FFSAVE_PNG: + if (default_filename.empty()) + { + default_filename = "untitled.png"; + } + file_filters.push_back({ "PNG Images (*.png)", "png" }); + break; + case FFSAVE_TGAPNG: + if (default_filename.empty()) + { + //PNG by default + default_filename = "untitled.png"; + } + file_filters.push_back({ "PNG Images (*.png)", "png" }); + file_filters.push_back({ "Targa Images (*.tga)", "tga" }); + break; + + case FFSAVE_JPEG: + if (default_filename.empty()) + { + default_filename = "untitled.jpeg"; + } + file_filters.push_back({ "JPEG Images (*.jpg *.jpeg)", "jpg;jpeg" }); + break; + case FFSAVE_AVI: + if (default_filename.empty()) + { + default_filename = "untitled.avi"; + } + file_filters.push_back({ "AVI Movie File (*.avi)", "avi" }); + break; + case FFSAVE_ANIM: + if (default_filename.empty()) + { + default_filename = "untitled.xaf"; + } + file_filters.push_back({ "XAF Anim File (*.xaf)", "xaf" }); + break; + case FFSAVE_GLTF: + if (default_filename.empty()) + { + default_filename = "untitled.gltf"; + } + file_filters.push_back({ "glTF Asset File (*.gltf)", "gltf" }); + break; + case FFSAVE_XML: + if (default_filename.empty()) + { + default_filename = "untitled.xml"; + } + file_filters.push_back({ "XML File (*.xml)", "xml" }); + break; + case FFSAVE_COLLADA: + if (default_filename.empty()) + { + default_filename = "untitled.collada"; + } + file_filters.push_back({ "COLLADA File (*.collada)", "collada" }); + break; + case FFSAVE_RAW: + if (default_filename.empty()) + { + default_filename = "untitled.raw"; + } + file_filters.push_back({ "RAW files (*.raw)", "raw" }); + break; + case FFSAVE_J2C: + if (default_filename.empty()) + { + default_filename = "untitled.j2c"; + } + file_filters.push_back({ "Compressed Images (*.j2c)", "j2c" }); + break; + case FFSAVE_SCRIPT: + if (default_filename.empty()) + { + default_filename = "untitled.lsl"; + } + file_filters.push_back({ "Script files (*.lsl; *.lua; *.luau)", "lsl;lua;luau" }); + break; + default: + return false; + } + + reset(); + + { + struct LLSDLFileUserdata + { + LLSDLFileUserdata(void (*callback_func)(bool, std::string&, void*), void* callback_userdata) + : mCallback(callback_func), mUserdata(callback_userdata) + { + } + void (*mCallback)(bool, std::string&, void*); + void* mUserdata; + }; + + auto sdl_callback = [](void* userdata, const char* const* filelist, int filter) + { + LLSDLFileUserdata* callback_struct = (LLSDLFileUserdata*)userdata; + + auto* callback_func = callback_struct->mCallback; + auto* callback_data = callback_struct->mUserdata; + delete callback_struct; // delete callback container + + std::string rtn; + if (!filelist) + { + LL_WARNS() << "Error during SDL file picking: " << SDL_GetError() << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + else if (!*filelist) + { + LL_INFOS() << "User did not select any file. Dialog likely cancelled." << LL_ENDL; + callback_func(false, rtn, callback_data); + return; + } + + while (*filelist) { + rtn = std::string(*filelist); + break; + } + callback_func(true, rtn, callback_data); + + }; + + LLSDLFileUserdata* llfilecallback = new LLSDLFileUserdata(callback, userdata); + + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_FILTERS_POINTER, file_filters.data()); + SDL_SetNumberProperty(props, SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER, file_filters.size()); + SDL_SetPointerProperty(props, SDL_PROP_FILE_DIALOG_WINDOW_POINTER, SDL_GL_GetCurrentWindow()); + + // Disabled default file name functionality currently due to inconsistency between various SDL3 backends + // if(!default_filename.empty()) + // { + // SDL_SetStringProperty(props, SDL_PROP_FILE_DIALOG_LOCATION_STRING, default_filename.c_str()); + // } + SDL_SetBooleanProperty(props, SDL_PROP_FILE_DIALOG_MANY_BOOLEAN, false); + + SDL_ShowFileDialogWithProperties(SDL_FILEDIALOG_SAVEFILE, sdl_callback, llfilecallback, props); + + SDL_DestroyProperties(props); + } + + return true; +} +#elif LL_WINDOWS bool LLFilePicker::setupFilter(ELoadFilter filter) { @@ -691,6 +1132,8 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF break; case FFLOAD_SCRIPT: allowedv->push_back("lsl"); + allowedv->push_back("lua"); + allowedv->push_back("luau"); break; case FFLOAD_DICTIONARY: allowedv->push_back("dic"); @@ -824,7 +1267,7 @@ void set_nav_save_data(LLFilePicker::ESaveFilter filter, std::string &extension, case LLFilePicker::FFSAVE_SCRIPT: type = "LSL "; creator = "\?\?\?\?"; - extension = "lsl"; + extension = "lsl;lua;luau"; break; case LLFilePicker::FFSAVE_ALL: @@ -1112,231 +1555,6 @@ bool LLFilePicker::getSaveFileModeless(ESaveFilter filter, #elif LL_LINUX || __FreeBSD__ -#if LL_FLTK - -bool LLFilePicker::getSaveFileModeless(ESaveFilter filter, - const std::string& filename, - void (*callback)(bool, std::string&, void*), - void *userdata) -{ - LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; - return FALSE; -} - -bool LLFilePicker::getOpenFileModeless(ELoadFilter filter, - void (*callback)(bool, std::vector<std::string> &, void*), - void *userdata) -{ - LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; - return FALSE; -} - -bool LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter, - void (*callback)(bool, std::vector<std::string> &, void*), - void *userdata ) -{ - LL_ERRS() << "NOT IMPLEMENTED" << LL_ENDL; - return FALSE; -} - - - -bool LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename, bool blocking ) -{ - return openFileDialog( filter, blocking, eSaveFile ); -} - -bool LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking ) -{ - return openFileDialog( filter, blocking, eOpenFile ); -} - -bool LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking) -{ - return openFileDialog( filter, blocking, eOpenMultiple ); -} - -bool LLFilePicker::openFileDialog( int32_t filter, bool blocking, EType aType ) -{ - if ( check_local_file_access_enabled() == false ) - return false; - gViewerWindow->getWindow()->beforeDialog(); - reset(); - Fl_Native_File_Chooser::Type flType = Fl_Native_File_Chooser::BROWSE_FILE; - if( aType == eOpenMultiple ) - flType = Fl_Native_File_Chooser::BROWSE_MULTI_FILE; - else if( aType == eSaveFile ) - flType = Fl_Native_File_Chooser::BROWSE_SAVE_FILE; - Fl_Native_File_Chooser flDlg; - std::string file_dialog_title; - std::string file_dialog_filter; - if (aType == EType::eSaveFile) - { - std::string file_type("all_files"); - switch ((ESaveFilter) filter) - { - case FFSAVE_ALL: - break; - case FFSAVE_TGA: - file_type = "targa_image_files"; - file_dialog_filter = "*.tga"; - break; - case FFSAVE_BMP: - file_type = "bitmap_image_files"; - file_dialog_filter = "*.bmp"; - break; - case FFSAVE_AVI: - file_type = "avi_movie_file"; - file_dialog_filter = "*.avi"; - break; - case FFSAVE_ANIM: - file_type = "xaf_animation_file"; - file_dialog_filter = "*.xaf"; - break; - case FFSAVE_XML: - file_type = "xml_file"; - file_dialog_filter = "*.xml"; - break; - case FFSAVE_COLLADA: - file_type = "collada_files"; - file_dialog_filter = "*.dae"; - break; - case FFSAVE_RAW: - file_type = "raw_file"; - file_dialog_filter = "*.raw"; - break; - case FFSAVE_J2C: - file_type = "compressed_image_files"; - file_dialog_filter = "*.j2c"; - break; - case FFSAVE_PNG: - file_type = "png_image_files"; - file_dialog_filter = "*.png"; - break; - case FFSAVE_JPEG: - file_type = "jpeg_image_files"; - file_dialog_filter = "*.{jpg,jpeg}"; - break; - case FFSAVE_SCRIPT: - file_type = "script_files"; - file_dialog_filter = "*.lsl"; - break; - case FFSAVE_TGAPNG: - file_type = "save_texture_image_files"; - file_dialog_filter = "*.{tga,png}"; - break; - case FFSAVE_WAV: - file_type = "sound_files"; - file_dialog_filter = "*.wav"; - break; - case FFSAVE_GLTF: - file_type = "gltf_asset_file"; - file_dialog_filter = "*.{gltf,glb}"; - break; - } - file_dialog_title = LLTrans::getString("save_file_verb") + " " + LLTrans::getString(file_type); - file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter; - } - else - { - std::string file_type("all_files"); - switch ((ELoadFilter) filter) - { - case FFLOAD_ALL: - break; - case FFLOAD_WAV: - file_type = "sound_files"; - file_dialog_filter = "*.wav"; - break; - case FFLOAD_IMAGE: - file_type = "image_files"; - file_dialog_filter = "*.{tga,bmp,jpg,jpeg,png}"; - break; - case FFLOAD_ANIM: - file_type = "animation_files"; - file_dialog_filter = "*.{bvh,anim}"; - break; - case FFLOAD_XML: - file_type = "xml_file"; - file_dialog_filter = "*.xml"; - break; - case FFLOAD_SLOBJECT: - file_type = "xml_file"; - file_dialog_filter = "*.slobject"; - break; - case FFLOAD_RAW: - file_type = "raw_file"; - file_dialog_filter = "*.raw"; - break; - case FFLOAD_MODEL: - case FFLOAD_COLLADA: - file_type = "collada_files"; - file_dialog_filter = "*.dae"; - break; - case FFLOAD_SCRIPT: - file_type = "script_files"; - file_dialog_filter = "*.lsl"; - break; - case FFLOAD_DICTIONARY: - file_type = "dictionary_files"; - file_dialog_filter = "*.{dic,xcu}"; - break; - case FFLOAD_DIRECTORY: - file_type = "choose_the_directory"; - break; - case FFLOAD_EXE: - file_type = "executable_files"; - break; - case FFLOAD_GLTF: - case FFLOAD_MATERIAL: - file_type = "gltf_asset_file"; - file_dialog_filter = "*.{gltg,glb}"; - break; - case FFLOAD_MATERIAL_TEXTURE: - file_dialog_filter = "*.{gltf,glb,tga,bmp,jpg,jpeg,png}"; - file_type = "image_files"; - break; - case FFLOAD_HDRI: - file_dialog_filter = "*.exr"; - - } - if (aType == EType::eOpenMultiple) - { - file_dialog_title = LLTrans::getString("load_files"); - } - else - { - file_dialog_title = LLTrans::getString("load_file_verb") + " " + LLTrans::getString(file_type); - file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter; - } - } - flDlg.title(file_dialog_title.c_str()); - flDlg.type(flType); - if (!file_dialog_filter.empty()) - { - flDlg.filter(file_dialog_filter.c_str()); - } - int res = flDlg.show(); - gViewerWindow->getWindow()->afterDialog(); - if( res == 0 ) - { - int32_t count = flDlg.count(); - if( count < 0 ) - count = 0; - for( int32_t i = 0; i < count; ++i ) - { - char const *pFile = flDlg.filename(i); - if( pFile && strlen(pFile) > 0 ) - mFiles.push_back( pFile ); - } - } - else if( res == -1 ) - { - LL_WARNS() << "FLTK failed: " << flDlg.errmsg() << LL_ENDL; - } - return mFiles.empty()?FALSE:TRUE; -} -#else // Hacky stubs designed to facilitate fake getSaveFile and getOpenFile with // static results, when we don't have a real filepicker. @@ -1424,8 +1642,6 @@ bool LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter, return false; } -#endif // LL_FLTK - #else // not implemented bool LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename, bool blocking ) diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index b99156c61e..5a4da61cca 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -35,6 +35,8 @@ #include "stdtypes.h" +#include <vector> + #if LL_DARWIN #include <Carbon/Carbon.h> @@ -43,7 +45,6 @@ #undef check #undef require -#include <vector> #include "llstring.h" #endif @@ -150,14 +151,14 @@ private: // is enabled and if not, tidy up and indicate we're not allowed to do this. bool check_local_file_access_enabled(); -#if LL_WINDOWS +#if LL_WINDOWS && !LL_SDL_WINDOW OPENFILENAMEW mOFN; // for open and save dialogs WCHAR mFilesW[FILENAME_BUFFER_SIZE]; bool setupFilter(ELoadFilter filter); #endif -#if LL_DARWIN +#if LL_DARWIN && !LL_SDL_WINDOW S32 mPickOptions; std::vector<std::string> mFileVector; @@ -173,14 +174,6 @@ private: void *userdata); #endif -#if LL_FLTK - enum EType - { - eSaveFile, eOpenFile, eOpenMultiple - }; - bool openFileDialog( int32_t filter, bool blocking, EType aType ); -#endif - std::vector<std::string> mFiles; S32 mCurrentFile; bool mLocked; diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 99e93bafbf..3a0bc4005e 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -26,15 +26,28 @@ #ifdef LL_DARWIN #import <Cocoa/Cocoa.h> +#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h> #include <iostream> #include "llfilepicker_mac.h" +// Convert a file extension or UTI string into a UTType for use with +// NSOpenPanel/NSSavePanel's allowedContentTypes. +static UTType *contentTypeForString(NSString *typeString) +{ + UTType *type = [UTType typeWithFilenameExtension:typeString]; + if (!type) + { + type = [UTType typeWithIdentifier:typeString]; + } + return type; +} + NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned int flags) { int i; NSOpenPanel *panel = [NSOpenPanel openPanel]; - NSMutableArray *fileTypes = nil; + NSMutableArray<UTType *> *fileTypes = nil; if ( allowed_types && !allowed_types->empty()) @@ -43,9 +56,13 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned for (i=0;i<allowed_types->size();++i) { - [fileTypes addObject: - [NSString stringWithCString:(*allowed_types)[i].c_str() - encoding:[NSString defaultCStringEncoding]]]; + NSString *typeString = [NSString stringWithCString:(*allowed_types)[i].c_str() + encoding:[NSString defaultCStringEncoding]]; + UTType *type = contentTypeForString(typeString); + if (type) + { + [fileTypes addObject:type]; + } } } @@ -57,9 +74,9 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; - if (fileTypes) + if (fileTypes && fileTypes.count > 0) { - [panel setAllowedFileTypes:fileTypes]; + [panel setAllowedContentTypes:fileTypes]; } else { @@ -196,12 +213,25 @@ std::unique_ptr<std::string> doSaveDialog(const std::string* file, NSSavePanel *panel = [NSSavePanel savePanel]; NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; - NSArray *fileType = [extensionns componentsSeparatedByString:@","]; + NSArray *extensions = [extensionns componentsSeparatedByString:@","]; + + NSMutableArray<UTType *> *fileType = [[NSMutableArray alloc] init]; + for (NSString *ext in extensions) + { + UTType *type = contentTypeForString(ext); + if (type) + { + [fileType addObject:type]; + } + } //[panel setMessage:@"Save Image File"]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; [panel setCanSelectHiddenExtension:true]; - [panel setAllowedFileTypes:fileType]; + if (fileType.count > 0) + { + [panel setAllowedContentTypes:fileType]; + } NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; NSURL* url = [NSURL fileURLWithPath:fileName]; @@ -231,12 +261,25 @@ void doSaveDialogModeless(const std::string* file, NSSavePanel *panel = [NSSavePanel savePanel]; NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; - NSArray *fileType = [extensionns componentsSeparatedByString:@","]; + NSArray *extensions = [extensionns componentsSeparatedByString:@","]; + + NSMutableArray<UTType *> *fileType = [[NSMutableArray alloc] init]; + for (NSString *ext in extensions) + { + UTType *type = contentTypeForString(ext); + if (type) + { + [fileType addObject:type]; + } + } //[panel setMessage:@"Save Image File"]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; [panel setCanSelectHiddenExtension:true]; - [panel setAllowedFileTypes:fileType]; + if (fileType.count > 0) + { + [panel setAllowedContentTypes:fileType]; + } NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; NSURL* url = [NSURL fileURLWithPath:fileName]; diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index 7d098b2676..8897ad55e0 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -151,7 +151,6 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so { S32 num_output_sections = 1<<dest_sections; LLVector3 scale = mVO->mDrawable->getScale(); - F32 source_section_length = scale.mV[VZ] / (F32)(1<<source_sections); F32 section_length = scale.mV[VZ] / (F32)num_output_sections; if (source_sections == -1) { @@ -183,6 +182,7 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so // Iterate from right to left since it may be an in-place computation S32 step_shift = dest_sections-source_sections; S32 num_steps = 1<<step_shift; + F32 source_section_length = scale.mV[VZ] / (F32)(1<<source_sections); for (S32 section=num_output_sections-num_steps; section>=0; section -= num_steps) { LLFlexibleObjectSection *last_source_section = &source[section>>step_shift]; diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index e41f893c43..506cff31f4 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -316,16 +316,23 @@ void LLFloaterBuyCurrency::handleBuyCurrency(bool has_piof, bool has_target, con if (has_piof) { LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance<LLFloaterBuyCurrencyUI>("buy_currency"); - if (has_target) + if (ui) { - ui->target(name, price); + if (has_target) + { + ui->target(name, price); + } + else + { + ui->noTarget(); + } + ui->updateUI(); + ui->collapsePanels(!has_target); } else { - ui->noTarget(); + LL_WARNS() << "Cannot instantiate buy_currency floater" << LL_ENDL; } - ui->updateUI(); - ui->collapsePanels(!has_target); } else { diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 56e086502a..520206fd5c 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -32,6 +32,7 @@ #include "lltoolmgr.h" #include "lltoolpipette.h" #include "llviewercontrol.h" +#include "llviewerwindow.h" #include "llworld.h" // Linden library includes @@ -45,6 +46,7 @@ #include "lllineeditor.h" #include "v4coloru.h" #include "llbutton.h" +#include "llcombobox.h" #include "lluictrlfactory.h" #include "llgl.h" #include "llpointer.h" @@ -76,7 +78,7 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, bool show mMouseDownInSwatch ( false ), // *TODO: Specify this in XML mRGBViewerImageLeft ( 140 ), - mRGBViewerImageTop ( 356 ), + mRGBViewerImageTop ( 436 ), mRGBViewerImageWidth ( 256 ), mRGBViewerImageHeight ( 256 ), mLumRegionLeft ( mRGBViewerImageLeft + mRGBViewerImageWidth + 16 ), @@ -86,18 +88,18 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, bool show mLumMarkerSize ( 6 ), // *TODO: Specify this in XML mSwatchRegionLeft ( 12 ), - mSwatchRegionTop ( 190 ), + mSwatchRegionTop ( 249 ), mSwatchRegionWidth ( 116 ), mSwatchRegionHeight ( 60 ), mSwatchView ( NULL ), // *TODO: Specify this in XML numPaletteColumns ( 16 ), - numPaletteRows ( 2 ), + numPaletteRows ( 4 ), highlightEntry ( -1 ), mPaletteRegionLeft ( 11 ), - mPaletteRegionTop ( 100 - 8 ), + mPaletteRegionTop ( 180 - 8 ), mPaletteRegionWidth ( mLumRegionLeft + mLumRegionWidth - 10 ), - mPaletteRegionHeight ( 40 ), + mPaletteRegionHeight ( 120 ), mSwatch ( swatch ), mActive ( true ), mCanApplyImmediately ( show_apply_immediate ), @@ -154,7 +156,7 @@ void LLFloaterColorPicker::createUI () // create palette for ( S32 each = 0; each < numPaletteColumns * numPaletteRows; ++each ) { - mPalette.push_back(new LLColor4(LLUIColorTable::instance().getColor(llformat("ColorPaletteEntry%02d", each + 1)))); + mPalette.push_back(new LLColor4(LLUIColorTable::instance().getColor(llformat("ColorPaletteEntry%02d", each + 1), LLColor4::grey))); } } @@ -232,6 +234,7 @@ bool LLFloaterColorPicker::postBuild() childSetCommitCallback("hspin", onTextCommit, (void*)this ); childSetCommitCallback("sspin", onTextCommit, (void*)this ); childSetCommitCallback("lspin", onTextCommit, (void*)this ); + childSetCommitCallback("hex_color", onTextCommit, (void*)this ); mPipetteConnection = LLToolPipette::getInstance()->setToolSelectCallback( [this](LLPointer<LLViewerObject> object, S32 te_index) @@ -243,6 +246,9 @@ bool LLFloaterColorPicker::postBuild() } }); + mCopyColorAsCombo = getChild<LLComboBox>("copy_color_combobox"); + mCopyColorAsCombo->setCommitCallback(boost::bind(&LLFloaterColorPicker::onCopyColor, this)); + return true; } @@ -678,6 +684,61 @@ void LLFloaterColorPicker::drawPalette () } ////////////////////////////////////////////////////////////////////////////// +// Convert input RGB (0..1.0) to a hex color string +std::string rgbFloatToHex(float r, float g, float b) +{ + auto toUint8 = [](float val) -> unsigned char { + return static_cast<unsigned char>(std::round(std::clamp(val * 255.0f, 0.0f, 255.0f))); + }; + + std::ostringstream oss; + oss << std::hex << std::uppercase << std::setfill('0'); + oss << std::setw(2) << static_cast<int>(toUint8(r)); + oss << std::setw(2) << static_cast<int>(toUint8(g)); + oss << std::setw(2) << static_cast<int>(toUint8(b)); + + return oss.str(); +} + +////////////////////////////////////////////////////////////////////////////// +// Boolean test if input string is a valid hex color string +bool LLFloaterColorPicker::isValidHexColor(std::string& hex_color, F32& hr, F32& hg, F32& hb) +{ + // Strip any whitespace and a leading # character if present + // (Often included in hex color strings from other places) + LLStringUtil::trim(hex_color); + if (!hex_color.empty() && hex_color.front() == '#') + { + hex_color = hex_color.substr(1); + } + + // Make sure it's a real string and valid hex - we can't use the + // hex to dec code because that coerces invalid hex into decimal 0 + if (hex_color.length() ==0 || hex_color.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) + { + return false; + } + + // Convert the hex string to a decimal number + std::stringstream oss; + oss << std::hex << hex_color; + unsigned int dec_val; + oss >> dec_val; + + // Break out the RGB values in 0..1.0 range and pass back + // (They will only be used if this function returns true.) + hr = F32(((dec_val >> 16) & 0xff)) / 255.0f; + hg = F32(((dec_val >> 8) & 0xff)) / 255.0f; + hb = F32(((dec_val >> 0) & 0xff)) / 255.0f; + + // The max chars in the field is more than 6 now so we can paste in + // poorly formatted color strings and reformat them on commit. + // TODO: there must be a way to to the preformat when the string + // is pasted into the line editor control. + return dec_val > 0xffffff ? false : true; +} + +////////////////////////////////////////////////////////////////////////////// // update text entry values for RGB/HSL (can't be done in ::draw () since this overwrites input void LLFloaterColorPicker::updateTextEntry () { @@ -688,6 +749,8 @@ void LLFloaterColorPicker::updateTextEntry () getChild<LLUICtrl>("hspin")->setValue(( getCurH () * 360.0f ) ); getChild<LLUICtrl>("sspin")->setValue(( getCurS () * 100.0f ) ); getChild<LLUICtrl>("lspin")->setValue(( getCurL () * 100.0f ) ); + + getChild<LLUICtrl>("hex_color")->setValue(rgbFloatToHex(curR, curG, curB)); } ////////////////////////////////////////////////////////////////////////////// @@ -745,6 +808,22 @@ void LLFloaterColorPicker::onTextEntryChanged ( LLUICtrl* ctrl ) selectCurHsl ( hVal, sVal, lVal ); updateTextEntry (); + } else + if (name == "hex_color") + { + F32 rVal, gVal, bVal; + std::string hex = ctrl->getValue().asString(); + if (isValidHexColor(hex, rVal, gVal, bVal)) + { + // Valid hex color - update the picker with specified value + selectCurRgb ( rVal, gVal, bVal ); + updateTextEntry (); + } + else + { + // Invalid hex color provided - update the hex color field with current color + updateTextEntry (); + } } } @@ -1096,3 +1175,74 @@ void LLFloaterColorPicker::stopUsingPipette() LLToolMgr::getInstance()->clearTransientTool(); } } + +void LLFloaterColorPicker::onCopyColor() +{ + LLComboBox* combo = getChild<LLComboBox>("copy_color_combobox"); + S32 combo_val = combo->getSelectedValue().asInteger(); + + std::ostringstream to_copy; + + // LSL - e.g. <0.571, 0.929, 0.585> + if (combo_val == 1) + { + to_copy << "<"; + to_copy << std::setfill('0') << std::setprecision(3) << ((getCurR() < 0.001) ? 0.0 : getCurR()); + to_copy << ", "; + to_copy << std::setfill('0') << std::setprecision(3) << ((getCurG() < 0.001) ? 0.0 : getCurG()); + to_copy << ", "; + to_copy << std::setfill('0') << std::setprecision(3) << ((getCurB() < 0.001) ? 0.0 : getCurB()); + to_copy << ">"; + } else + // HEX e.g. #92ED95 + if (combo_val == 2) + { + to_copy << "#"; + to_copy << rgbFloatToHex(getCurR(), getCurG(), getCurB()); + } else + // RGB e.g. (146, 237, 149) + if (combo_val == 3) + { + to_copy << "("; + to_copy << (S32)(getCurR() * 255.0f + 0.5f); + to_copy << ", "; + to_copy << (S32)(getCurG() * 255.0f + 0.5f); + to_copy << ", "; + to_copy << (S32)(getCurB() * 255.0f + 0.5f); + to_copy << ")"; + } else + // HSL e.g. (122°, 71%, 75%) + if (combo_val == 4) + { + to_copy << "("; + to_copy << (S32)(getCurH() * 360.0f + 0.5f); + to_copy << "\xC2\xB0, "; + to_copy << (S32)(getCurS() * 100.0f + 0.5f); + to_copy << "%, "; + to_copy << (S32)(getCurL() * 100.0f + 0.5f); + to_copy << "%)"; + } + // CMYK e.g. (38%, 0%, 37%, 7%) + if (combo_val == 5) + { + F32 k = 1.0f - std::max({getCurR(), getCurG(), getCurB()}); + F32 c = (k == 1.0f) ? 0.0f : (1.0f - getCurR() - k) / (1.0f - k); + F32 m = (k == 1.0f) ? 0.0f : (1.0f - getCurG() - k) / (1.0f - k); + F32 y = (k == 1.0f) ? 0.0f : (1.0f - getCurB() - k) / (1.0f - k); + to_copy << "("; + to_copy << (S32)(c * 100.0f + 0.5f); + to_copy << "%, "; + to_copy << (S32)(m * 100.0f + 0.5f); + to_copy << "%, "; + to_copy << (S32)(y * 100.0f + 0.5f); + to_copy << "%, "; + to_copy << (S32)(k * 100.0f + 0.5f); + to_copy << "%"; + to_copy << ")"; + } + + if (! to_copy.str().empty()) + { + gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(to_copy.str())); + } +} diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index af199d92a3..93f67f40ea 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -37,6 +37,7 @@ class LLButton; class LLLineEditor; class LLCheckBoxCtrl; +class LLComboBox; ////////////////////////////////////////////////////////////////////////////// // floater class @@ -127,6 +128,10 @@ class LLFloaterColorPicker // mutators for color values, can raise event to preview changes at object void selectCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ); void selectCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn ); + + // utility functions for manipulating hex colors + bool isValidHexColor(std::string& hex_color, F32& hr, F32& hg, F32& hb); + // draws color selection palette void drawPalette (); @@ -192,6 +197,9 @@ class LLFloaterColorPicker LLButton* mPipetteBtn; + LLComboBox* mCopyColorAsCombo; + void onCopyColor(); + F32 mContextConeOpacity; F32 mContextConeInAlpha; F32 mContextConeOutAlpha; diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h index de788443be..fb3b9975ed 100644 --- a/indra/newview/llfloaterdirectory.h +++ b/indra/newview/llfloaterdirectory.h @@ -76,6 +76,6 @@ private: static LLFloaterDirectory *sInstance; }; -//extern BOOL gDisplayEventHack; +//extern bool gDisplayEventHack; #endif // LL_LLDIRECTORYFLOATER_H diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index b7f4df874c..4a9e8c635b 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -1002,6 +1002,9 @@ bool LLFloaterEmojiPicker::moveFocusedIconNext() if (mHoveredIcon) return false; + if (mFocusedIconRow < 0 || static_cast<size_t>(mFocusedIconRow) >= mEmojiGrid->getPanelList().size()) + return false; + LLScrollingPanel* panel = mEmojiGrid->getPanelList()[mFocusedIconRow]; LLEmojiGridRow* row = dynamic_cast<LLEmojiGridRow*>(panel); S32 colCount = row ? static_cast<S32>(row->mList->getPanelList().size()) : 0; diff --git a/indra/newview/llfloatergestureautocompletepicker.cpp b/indra/newview/llfloatergestureautocompletepicker.cpp new file mode 100644 index 0000000000..c7c4e46459 --- /dev/null +++ b/indra/newview/llfloatergestureautocompletepicker.cpp @@ -0,0 +1,154 @@ +/** + * @file llfloatergestureautocompletepicker.cpp + * + * $LicenseInfo:firstyear=2026&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2026, 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 "llfloatergestureautocompletepicker.h" + +#include "llgestureautocompletehelper.h" +#include "llscrolllistctrl.h" +#include "llscrolllistitem.h" + +LLFloaterGestureAutocompletePicker::LLFloaterGestureAutocompletePicker(const LLSD& key) +: LLFloater(key), mGestureList(NULL) +{ + setFocusStealsFrontmost(false); + setBackgroundVisible(false); + setAutoFocus(false); +} + +bool LLFloaterGestureAutocompletePicker::postBuild() +{ + mGestureList = getChild<LLScrollListCtrl>("gesture_list"); + mGestureList->setCommitOnKeyboardMovement(false); + mGestureList->setCommitCallback(boost::bind(&LLFloaterGestureAutocompletePicker::commitSelected, this)); + + return LLFloater::postBuild(); +} + +void LLFloaterGestureAutocompletePicker::onOpen(const LLSD& key) +{ + LLGestureAutocompleteHelper& helper = LLGestureAutocompleteHelper::instance(); + mGestureList->clearRows(); + + const std::vector<LLGestureAutocompleteHelper::Row>& rows = helper.rows(); + + for (const auto& row : rows) + { + LLSD element; + element["value"] = row.value; + element["columns"][0]["column"] = "trigger"; + element["columns"][0]["value"] = row.trigger; + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = row.name; + mGestureList->addElement(element); + } + + if (helper.total() > rows.size()) + { + LLSD element; + element["enabled"] = false; + element["columns"][0]["column"] = "trigger"; + element["columns"][0]["value"] = LLStringUtil::null; + element["columns"][1]["column"] = "name"; + + LLStringUtil::format_map_t args; + args["[COUNT]"] = llformat("%d", (S32)rows.size()); + args["[TOTAL]"] = llformat("%d", (S32)helper.total()); + element["columns"][1]["value"] = getString("showing_count", args); + + mGestureList->addElement(element); + } + + mGestureList->selectFirstItem(); + gFloaterView->adjustToFitScreen(this, false); +} + +bool LLFloaterGestureAutocompletePicker::handleKey(KEY key, MASK mask, bool called_from_parent) +{ + if (mask == MASK_NONE) + { + switch (key) + { + case KEY_UP: + mGestureList->selectPrevItem(); + mGestureList->scrollToShowSelected(); + return true; + case KEY_DOWN: + mGestureList->selectNextItem(); + mGestureList->scrollToShowSelected(); + return true; + case KEY_RETURN: + case KEY_TAB: + commitSelected(); + return true; + case KEY_ESCAPE: + LLGestureAutocompleteHelper::instance().hideHelper(); + return true; + case KEY_LEFT: + case KEY_RIGHT: + return true; + default: + break; + } + } + + return LLFloater::handleKey(key, mask, called_from_parent); +} + +void LLFloaterGestureAutocompletePicker::onClose(bool app_quitting) +{ + if (!app_quitting) + { + LLGestureAutocompleteHelper::instance().hideHelper(); + } +} + +void LLFloaterGestureAutocompletePicker::goneFromFront() +{ + LLGestureAutocompleteHelper::instance().hideHelper(); +} + +bool LLFloaterGestureAutocompletePicker::commitSelected() +{ + LLScrollListItem* item = mGestureList->getFirstSelected(); + + if (!item || !item->getEnabled()) + { + return false; + } + + const std::string value = mGestureList->getSelectedValue().asString(); + + if (value.empty()) + { + return false; + } + + setValue(value); + onCommit(); + + return true; +} diff --git a/indra/newview/llfloaterhowto.h b/indra/newview/llfloatergestureautocompletepicker.h index 9d7793817a..71f754138d 100644 --- a/indra/newview/llfloaterhowto.h +++ b/indra/newview/llfloatergestureautocompletepicker.h @@ -1,10 +1,9 @@ /** - * @file llfloaterhowto.h - * @brief A variant of web floater meant to open guidebook + * @file llfloatergestureautocompletepicker.h * - * $LicenseInfo:firstyear=2021&license=viewerlgpl$ + * $LicenseInfo:firstyear=2026&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2021, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -24,35 +23,25 @@ * $/LicenseInfo$ */ -#ifndef LL_LLFLOATERHOWTO_H -#define LL_LLFLOATERHOWTO_H +#pragma once -#include "llfloaterwebcontent.h" +#include "llfloater.h" -class LLMediaCtrl; +class LLScrollListCtrl; - -class LLFloaterHowTo : - public LLFloaterWebContent +class LLFloaterGestureAutocompletePicker : public LLFloater { public: - LOG_CLASS(LLFloaterHowTo); - - typedef LLFloaterWebContent::Params Params; - - LLFloaterHowTo(const Params& key); + LLFloaterGestureAutocompletePicker(const LLSD& key); + bool postBuild() override; void onOpen(const LLSD& key) override; - - bool handleKeyHere(KEY key, MASK mask) override; - - static LLFloaterHowTo* getInstance(); - - bool matchesKey(const LLSD& key) override { return true; /*single instance*/ }; + bool handleKey(KEY key, MASK mask, bool called_from_parent) override; + void onClose(bool app_quitting) override; + void goneFromFront() override; private: - bool postBuild() override; -}; - -#endif // LL_LLFLOATERHOWTO_H + bool commitSelected(); + LLScrollListCtrl* mGestureList; +}; diff --git a/indra/newview/llfloatergotoline.cpp b/indra/newview/llfloatergotoline.cpp index 09ca0ab530..6b3f16ecf5 100644 --- a/indra/newview/llfloatergotoline.cpp +++ b/indra/newview/llfloatergotoline.cpp @@ -109,8 +109,9 @@ void LLFloaterGotoLine::handleBtnGoto() { if (mEditorCore && mEditorCore->mEditor) { + S32 target_row = mEditorCore->mEditor->getIsLuauLanguage() ? (row - 1) : row; mEditorCore->mEditor->deselect(); - mEditorCore->mEditor->setCursor(row, column); + mEditorCore->mEditor->setCursor(target_row, column); mEditorCore->mEditor->setFocus(true); } } @@ -144,12 +145,13 @@ void LLFloaterGotoLine::onGotoBoxCommit() { if (mEditorCore && mEditorCore->mEditor) { - mEditorCore->mEditor->setCursor(row, column); + S32 target_row = mEditorCore->mEditor->getIsLuauLanguage() ? (row - 1) : row; + mEditorCore->mEditor->setCursor(target_row, column); S32 rownew = 0; S32 columnnew = 0; mEditorCore->mEditor->getCurrentLineAndColumn( &rownew, &columnnew, false ); // don't include wordwrap - if (rownew == row && columnnew == column) + if (rownew == target_row && columnnew == column) { mEditorCore->mEditor->deselect(); mEditorCore->mEditor->setFocus(true); diff --git a/indra/newview/llfloaterhowto.cpp b/indra/newview/llfloaterhowto.cpp deleted file mode 100644 index 6a9f113d53..0000000000 --- a/indra/newview/llfloaterhowto.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file llfloaterhowto.cpp - * @brief A variant of web floater meant to open guidebook - * - * $LicenseInfo:firstyear=2021&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2021, 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 "llfloaterhowto.h" - -#include "llfloaterreg.h" -#include "llviewercontrol.h" -#include "llweb.h" - - -constexpr S32 STACK_WIDTH = 300; -constexpr S32 STACK_HEIGHT = 505; // content will be 500 - -LLFloaterHowTo::LLFloaterHowTo(const Params& key) : - LLFloaterWebContent(key) -{ - mShowPageTitle = false; -} - -bool LLFloaterHowTo::postBuild() -{ - LLFloaterWebContent::postBuild(); - - return true; -} - -void LLFloaterHowTo::onOpen(const LLSD& key) -{ - LLFloaterWebContent::Params p(key); - if (!p.url.isProvided() || p.url.getValue().empty()) - { - std::string url = gSavedSettings.getString("GuidebookURL"); - p.url = LLWeb::expandURLSubstitutions(url, LLSD()); - } - p.show_chrome = false; - - LLFloaterWebContent::onOpen(p); - - if (p.preferred_media_size().isEmpty()) - { - // Elements from LLFloaterWebContent did not pick up restored size (save_rect) of LLFloaterHowTo - // set the stack size and position (alternative to preferred_media_size) - LLLayoutStack *stack = getChild<LLLayoutStack>("stack1"); - LLRect stack_rect = stack->getRect(); - stack->reshape(STACK_WIDTH, STACK_HEIGHT); - stack->setOrigin(stack_rect.mLeft, stack_rect.mTop - STACK_HEIGHT); - stack->updateLayout(); - } -} - -LLFloaterHowTo* LLFloaterHowTo::getInstance() -{ - return LLFloaterReg::getTypedInstance<LLFloaterHowTo>("guidebook"); -} - -bool LLFloaterHowTo::handleKeyHere(KEY key, MASK mask) -{ - bool handled = false; - - if (KEY_F1 == key ) - { - closeFloater(); - handled = true; - } - - return handled; -} diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index f8f34ca12e..e466090624 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -163,16 +163,24 @@ void LLFloaterIMContainer::sessionIDUpdated(const LLUUID& old_session_id, const // Note however that the LLFloaterIMSession has its session id updated through a call to sessionInitReplyReceived() // and do not need to be deleted and recreated (trying this creates loads of problems). We do need however to suppress // its related mSessions record as it's indexed with the wrong id. - // Grabbing the updated LLFloaterIMSession and readding it in mSessions will eventually be done by addConversationListItem(). mSessions.erase(old_session_id); - // Delete the model and participants related to the old session - bool change_focus = removeConversationListItem(old_session_id); + // Remove the old conversation widget without changing focus - we'll immediately re-add with + // the new id and select it, avoiding an unnecessary focus switch to an adjacent conversation. + bool was_selected = removeConversationListItem(old_session_id, false); // Create a new conversation with the new id - addConversationListItem(new_session_id, change_focus); + addConversationListItem(new_session_id, was_selected); LLFloaterIMSessionTab::addToHost(new_session_id); + // addToHost is a no-op for already-hosted floaters, so mSessions won't be + // updated by addFloater. Re-register manually so message flash works. + LLFloaterIMSessionTab* conversp = LLFloaterIMSessionTab::findConversation(new_session_id); + if (conversp && mSessions.find(new_session_id) == mSessions.end()) + { + mSessions[new_session_id] = conversp; + } + if (was_active) { selectConversationPair(new_session_id, true, false, true); @@ -2371,7 +2379,7 @@ bool LLFloaterIMContainer::isNearbyChatSpeakerSelected() if (!selectedItem) { LL_WARNS() << "Current selected item is null" << LL_ENDL; - return NULL; + return false; } conversations_widgets_map::const_iterator iter = mConversationsWidgets.begin(); diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 6143d5b89e..6c6050ea66 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -55,6 +55,7 @@ #include "llfloaterimnearbychatlistener.h" #include "llagent.h" // gAgent #include "llgesturemgr.h" +#include "llgestureautocompletehelper.h" #include "llmultigesture.h" #include "llkeyboard.h" #include "llanimationstates.h" @@ -71,6 +72,8 @@ #include "lluiusage.h" #include "rlvactions.h" +#include <map> + S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0; static LLFloaterIMNearbyChatListener sChatListener; @@ -78,6 +81,67 @@ static LLFloaterIMNearbyChatListener sChatListener; constexpr S32 EXPANDED_HEIGHT = 266; constexpr S32 COLLAPSED_HEIGHT = 60; constexpr S32 EXPANDED_MIN_HEIGHT = 150; +constexpr size_t MAX_GESTURE_AUTOCOMPLETE_ROWS = 50; + +namespace +{ +bool buildGestureAutocompleteRows( + const std::string& prefix, + std::vector<LLGestureAutocompleteHelper::Row>& rows, + size_t& total) +{ + rows.clear(); + total = 0; + + // Wait for at least one character after the slash before offering matches. + if (prefix.size() < 2 || prefix[0] != '/' || prefix.find_first_of(" \t") != std::string::npos) + { + return false; + } + + std::string lower_prefix = prefix; + LLStringUtil::toLower(lower_prefix); + + std::map<std::string, std::string> unique; + const LLGestureMgr::item_map_t& active = LLGestureMgr::instance().getActiveGestures(); + + for (const auto& entry : active) + { + LLMultiGesture* gesture = entry.second; + + if (!gesture || gesture->getTrigger().empty() || gesture->getTrigger()[0] != '/') + { + continue; + } + + std::string lower_trigger = gesture->getTrigger(); + LLStringUtil::toLower(lower_trigger); + + if (lower_trigger.compare(0, lower_prefix.size(), lower_prefix) != 0) + { + continue; + } + + unique.emplace( + gesture->getTrigger(), + gesture->mName); + } + + for (const auto& [trigger, name] : unique) + { + if (rows.size() >= MAX_GESTURE_AUTOCOMPLETE_ROWS) + { + break; + } + + rows.push_back({ trigger, trigger, name }); + } + + total = unique.size(); + + return total > 0; +} +} // legacy callback glue void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel); @@ -504,8 +568,32 @@ void LLFloaterIMNearbyChat::onChatBoxKeystroke() KEY key = gKeyboard->currentKey(); + static LLCachedControl<bool> autocomplete_gestures(gSavedSettings, "ChatAutocompleteGestures", true); + + if (autocomplete_gestures) + { + std::vector<LLGestureAutocompleteHelper::Row> rows; + size_t total = 0; + const std::string utf8_trigger = wstring_to_utf8str(raw_text); + + if (buildGestureAutocompleteRows(utf8_trigger, rows, total)) + { + LLGestureAutocompleteHelper::instance().showHelper( + mInputEditor, + rows, + total, + [this](std::string trigger) + { + mInputEditor->setText(trigger + " "); + mInputEditor->endOfDoc(); + }); + return; + } + + LLGestureAutocompleteHelper::instance().hideHelper(mInputEditor); + } // Ignore "special" keys, like backspace, arrows, etc. - if (gSavedSettings.getBOOL("ChatAutocompleteGestures") + if (autocomplete_gestures && length > 1 && raw_text[0] == '/' && key < KEY_SPECIAL) @@ -592,6 +680,9 @@ void LLFloaterIMNearbyChat::sendChat( EChatType type ) LLWString text = mInputEditor->getConvertedText(); LLWStringUtil::trim(text); LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. + + LLGestureAutocompleteHelper::instance().hideHelper(); + if (!text.empty()) { // Check if this is destined for another channel diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index ec9458ea9b..34570725ce 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -44,6 +44,7 @@ #include "llfloaterimcontainer.h" #include "llrootview.h" #include "lllayoutstack.h" +#include "llscripteditorws.h" //add LLFloaterIMNearbyChatHandler to LLNotificationsUI namespace using namespace LLNotificationsUI; @@ -144,6 +145,8 @@ protected: void updateToastFadingTime(); + LLToast* getToastFromPool(); + create_toast_panel_callback_t m_create_toast_panel_callback_t; bool createPoolToast(); @@ -237,9 +240,19 @@ void LLFloaterIMNearbyChatScreenChannel::updateToastsLifetime() S32 seconds = gSavedSettings.getS32("NearbyToastLifeTime"); toast_list_t::iterator it; - for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) + for(it = m_toast_pool.begin(); it != m_toast_pool.end();) { - (*it).get()->setLifetime(seconds); + LLToast* toast = it->get(); + if (toast) + { + toast->setLifetime(seconds); + ++it; + } + else + { + LL_WARNS("NearbyChat") << "Discarding destroyed toast from pool" << LL_ENDL; + it = m_toast_pool.erase(it); + } } } @@ -248,10 +261,36 @@ void LLFloaterIMNearbyChatScreenChannel::updateToastFadingTime() S32 seconds = gSavedSettings.getS32("NearbyToastFadingTime"); toast_list_t::iterator it; - for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) + for(it = m_toast_pool.begin(); it != m_toast_pool.end();) + { + LLToast* toast = it->get(); + if (toast) + { + toast->setFadingTime(seconds); + ++it; + } + else + { + LL_WARNS("NearbyChat") << "Discarding destroyed toast from pool" << LL_ENDL; + it = m_toast_pool.erase(it); + } + } +} + +LLToast* LLFloaterIMNearbyChatScreenChannel::getToastFromPool() +{ + while (!m_toast_pool.empty()) { - (*it).get()->setFadingTime(seconds); + LLToast* toast = m_toast_pool.back().get(); + m_toast_pool.pop_back(); + + if (toast) + return toast; + + LL_WARNS("NearbyChat") << "Discarding destroyed toast from pool" << LL_ENDL; } + + return nullptr; } bool LLFloaterIMNearbyChatScreenChannel::createPoolToast() @@ -335,6 +374,7 @@ void LLFloaterIMNearbyChatScreenChannel::addChat(LLSD& chat) { if (!gSavedSettings.getBOOL("ShowScriptErrors")) return; + if (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1) return; } @@ -342,9 +382,18 @@ void LLFloaterIMNearbyChatScreenChannel::addChat(LLSD& chat) //take 1st element from pool, (re)initialize it, put it in active toasts LL_DEBUGS("NearbyChat") << "Getting toast from pool" << LL_ENDL; - LLToast* toast = m_toast_pool.back().get(); + LLToast* toast = getToastFromPool(); + if (!toast) + { + // A toast can be destroyed while its handle remains in the pool. + // Replenish the pool instead of dereferencing the dead handle. + if (!createPoolToast()) + return; - m_toast_pool.pop_back(); + toast = getToastFromPool(); + if (!toast) + return; + } LLFloaterIMNearbyChatToastPanel* panel = dynamic_cast<LLFloaterIMNearbyChatToastPanel*>(toast->getPanel()); @@ -515,6 +564,23 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg, return; } + if (LLScriptEditorWSServer::isEnabled() && + gSavedSettings.getBOOL("ExternalWebsocketForwardDebug") && + (chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG || + chat_msg.mChatType == CHAT_TYPE_OWNER)) + { + LLScriptEditorWSServer::ptr_t server = + LLScriptEditorWSServer::getServer(); + if (server) + { + const auto channel = + chat_msg.mChatType == CHAT_TYPE_OWNER + ? LLPublishedObjectMgr::RuntimeEventAggregator::Channel::OWNER_SAY + : LLPublishedObjectMgr::RuntimeEventAggregator::Channel::DEBUG; + server->forwardChatToIDE(chat_msg, channel); + } + } + // don't show toast and add message to chat history on receive debug message // with disabled setting showing script errors or enabled setting to show script // errors in separate window. @@ -545,7 +611,6 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg, return; } } - nearby_chat->addMessage(chat_msg, true, args); if (chat_msg.mSourceType == CHAT_SOURCE_AGENT diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h index a442099ad1..aa03fc4e62 100644 --- a/indra/newview/llfloaterimsession.h +++ b/indra/newview/llfloaterimsession.h @@ -39,7 +39,6 @@ class LLAvatarName; class LLButton; class LLChatEntry; class LLTextEditor; -class LLPanelChatControlPanel; class LLChatHistory; class LLInventoryItem; class LLInventoryCategory; diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index b27ac1b8f9..d97b0eaa33 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -38,7 +38,6 @@ #include "llconversationview.h" #include "lltexteditor.h" -class LLPanelChatControlPanel; class LLChatEntry; class LLChatHistory; class LLPanelEmojiComplete; @@ -118,6 +117,8 @@ public: virtual void sessionVoiceOrIMStarted(const LLUUID& session_id) override {}; // Stub virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) override {}; // Stub + bool isP2PSessionType() { return mIsP2PChat; } + protected: // callback for click on any items of the visual states menu diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 163edf0426..77a98943ac 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -78,18 +78,21 @@ LLFloaterInspect::~LLFloaterInspect(void) { mCreatorNameCacheConnection.disconnect(); } - if(!LLFloaterReg::instanceVisible("build")) + if (!LLApp::isExiting()) { - if(LLToolMgr::getInstance()->getBaseTool() == LLToolCompInspect::getInstance()) + if (!LLFloaterReg::instanceVisible("build")) { - LLToolMgr::getInstance()->clearTransientTool(); + if (LLToolMgr::getInstance()->getBaseTool() == LLToolCompInspect::getInstance()) + { + LLToolMgr::getInstance()->clearTransientTool(); + } + // Switch back to basic toolset + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); + } + else + { + LLFloaterReg::showInstance("build", LLSD(), true); } - // Switch back to basic toolset - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - } - else - { - LLFloaterReg::showInstance("build", LLSD(), true); } } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 5c5219bcdd..3dc4e53250 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -108,18 +108,6 @@ public: virtual void changed() { LLFloaterLand::refreshAll(); } }; -// class needed to get full access to textbox inside checkbox, because LLCheckBoxCtrl::setLabel() has string as its argument. -// It was introduced while implementing EXT-4706 -class LLCheckBoxWithTBAcess : public LLCheckBoxCtrl -{ -public: - LLTextBox* getTextBox() - { - return mLabel; - } -}; - - class LLPanelLandExperiences : public LLPanel { @@ -466,9 +454,6 @@ bool LLPanelLandGeneral::postBuild() mContentRating = getChild<LLTextBox>("ContentRatingText"); mLandType = getChild<LLTextBox>("LandTypeText"); - mBtnProfile = getChild<LLButton>("Profile..."); - mBtnProfile->setClickedCallback(boost::bind(&LLPanelLandGeneral::onClickProfile, this)); - mTextGroupLabel = getChild<LLTextBox>("Group:"); mTextGroup = getChild<LLTextBox>("GroupText"); @@ -599,8 +584,6 @@ void LLPanelLandGeneral::refresh() mTextOwner->setText(LLStringUtil::null); mContentRating->setText(LLStringUtil::null); mLandType->setText(LLStringUtil::null); - mBtnProfile->setLabel(getString("profile_text")); - mBtnProfile->setEnabled(false); mTextClaimDate->setText(LLStringUtil::null); mTextGroup->setText(LLStringUtil::null); @@ -682,7 +665,6 @@ void LLPanelLandGeneral::refresh() mTextSalePending->setEnabled(false); mTextOwner->setText(getString("public_text")); mTextOwner->setEnabled(false); - mBtnProfile->setEnabled(false); mTextClaimDate->setText(LLStringUtil::null); mTextClaimDate->setEnabled(false); mTextGroup->setText(getString("none_text")); @@ -711,21 +693,14 @@ void LLPanelLandGeneral::refresh() //refreshNames(); mTextOwner->setEnabled(true); - // We support both group and personal profiles - mBtnProfile->setEnabled(true); - if (parcel->getGroupID().isNull()) { - // Not group owned, so "Profile" - mBtnProfile->setLabel(getString("profile_text")); mTextGroup->setText(getString("none_text")); mTextGroup->setEnabled(false); } else { - // Group owned, so "Info" - mBtnProfile->setLabel(getString("info_text")); //mTextGroup->setText("HIPPOS!");//parcel->getGroupName()); mTextGroup->setEnabled(true); @@ -959,23 +934,6 @@ void LLPanelLandGeneral::onClickSetGroup() } } -void LLPanelLandGeneral::onClickProfile() -{ - LLParcel* parcel = mParcel->getParcel(); - if (!parcel) return; - - if (parcel->getIsGroupOwned()) - { - const LLUUID& group_id = parcel->getGroupID(); - LLGroupActions::show(group_id); - } - else - { - const LLUUID& avatar_id = parcel->getOwnerID(); - LLAvatarActions::showProfile(avatar_id); - } -} - // public void LLPanelLandGeneral::setGroup(const LLUUID& group_id) { @@ -2176,12 +2134,11 @@ void LLPanelLandOptions::refresh() mMatureCtrl->setVisible(true); LLStyle::Params style; style.image(LLUI::getUIImage(gFloaterView->getParentFloater(this)->getString("maturity_icon_moderate"))); - LLCheckBoxWithTBAcess* fullaccess_mature_ctrl = (LLCheckBoxWithTBAcess*)mMatureCtrl; - fullaccess_mature_ctrl->getTextBox()->setText(LLStringExplicit("")); - fullaccess_mature_ctrl->getTextBox()->appendImageSegment(style); - fullaccess_mature_ctrl->getTextBox()->appendText(getString("mature_check_mature"), false); - fullaccess_mature_ctrl->setToolTip(getString("mature_check_mature_tooltip")); - fullaccess_mature_ctrl->reshape(fullaccess_mature_ctrl->getRect().getWidth(), fullaccess_mature_ctrl->getRect().getHeight(), false); + mMatureCtrl->getTextBox()->setText(LLStringExplicit("")); + mMatureCtrl->getTextBox()->appendImageSegment(style); + mMatureCtrl->getTextBox()->appendText(getString("mature_check_mature"), false); + mMatureCtrl->setToolTip(getString("mature_check_mature_tooltip")); + mMatureCtrl->reshape(mMatureCtrl->getRect().getWidth(), mMatureCtrl->getRect().getHeight(), false); // they can see the checkbox, but its disposition depends on the // state of the region diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 8af0caab33..79e5da042f 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -146,7 +146,6 @@ public: virtual void draw(); void setGroup(const LLUUID& group_id); - void onClickProfile(); void onClickSetGroup(); static void onClickDeed(void*); static void onClickBuyLand(void* data); @@ -193,7 +192,6 @@ protected: LLTextBox* mTextOwnerLabel; LLTextBox* mTextOwner; - LLButton* mBtnProfile; LLTextBox* mContentRating; LLTextBox* mLandType; diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 83abbb0357..83abbb0357 100755..100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp diff --git a/indra/newview/llfloaternotificationstabbed.cpp b/indra/newview/llfloaternotificationstabbed.cpp index e571011acf..8eeba095b2 100644 --- a/indra/newview/llfloaternotificationstabbed.cpp +++ b/indra/newview/llfloaternotificationstabbed.cpp @@ -45,7 +45,6 @@ LLFloaterNotificationsTabbed::LLFloaterNotificationsTabbed(const LLSD& key) : LL mGroupNoticeMessageList(NULL), mTransactionMessageList(NULL), mSystemMessageList(NULL), - mNotificationsSeparator(NULL), mNotificationsTabContainer(NULL), NOTIFICATION_TABBED_ANCHOR_NAME("notification_well_panel"), IM_WELL_ANCHOR_NAME("im_well_panel"), @@ -54,7 +53,7 @@ LLFloaterNotificationsTabbed::LLFloaterNotificationsTabbed(const LLSD& key) : LL { setOverlapsScreenChannel(true); mNotificationUpdates.reset(new NotificationTabbedChannel(this)); - mNotificationsSeparator = new LLNotificationSeparator(); + mNotificationsSeparator = std::make_unique<LLNotificationSeparator>(); } //--------------------------------------------------------------------------------- @@ -117,6 +116,7 @@ void LLFloaterNotificationsTabbed::setSysWellChiclet(LLSysWellChiclet* chiclet) //--------------------------------------------------------------------------------- LLFloaterNotificationsTabbed::~LLFloaterNotificationsTabbed() { + mNotificationsSeparator.reset(); } //--------------------------------------------------------------------------------- diff --git a/indra/newview/llfloaternotificationstabbed.h b/indra/newview/llfloaternotificationstabbed.h index 87e880c8d2..49dfe6033f 100644 --- a/indra/newview/llfloaternotificationstabbed.h +++ b/indra/newview/llfloaternotificationstabbed.h @@ -162,7 +162,7 @@ private: LLNotificationListView* mGroupNoticeMessageList; LLNotificationListView* mTransactionMessageList; LLNotificationListView* mSystemMessageList; - LLNotificationSeparator* mNotificationsSeparator; + std::unique_ptr<LLNotificationSeparator> mNotificationsSeparator; LLTabContainer* mNotificationsTabContainer; LLButton* mDeleteAllBtn; LLButton* mCollapseAllBtn; diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index bd8530abd7..cf89518c03 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -33,8 +33,10 @@ #include "lltextbox.h" #include "llagent.h" +#include "llcallbacklist.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" +#include "llmeshrepository.h" static const std::string lod_strings[4] = { @@ -74,6 +76,14 @@ bool LLCrossParcelFunctor::apply(LLViewerObject* obj) LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) : LLFloater(key), + mWeightsDirty(false), + mSelectionDirty(true), + mSelectionMeshDirty(true), + mSelectionLastLOD(-1), + mSelectionLastTris(0), + mSelectionLastArea(0), + mLastActiveLODRequests(0), + mSelectionRefreshTime(0.), mSelectedObjects(NULL), mSelectedPrims(NULL), mSelectedDownloadWeight(NULL), @@ -88,6 +98,13 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) mTrianglesShown(nullptr), mPixelArea(nullptr) { + mSelectionConnection = LLSelectMgr::getInstance()->mUpdateSignal.connect( + [this]() + { + mSelectionDirty = true; + mSelectionMeshDirty = true; // assume that mesh data will arrive with a delay. + } + ); } LLFloaterObjectWeights::~LLFloaterObjectWeights() @@ -114,6 +131,11 @@ bool LLFloaterObjectWeights::postBuild() mTrianglesShown = getChild<LLTextBox>("triangles_shown"); mPixelArea = getChild<LLTextBox>("pixel_area"); + mHighLodTris = getChild<LLTextBox>("high_lod_tris"); + mMediumLodTris = getChild<LLTextBox>("medium_lod_tris"); + mLowLodTris = getChild<LLTextBox>("low_lod_tris"); + mLowestLodTris = getChild<LLTextBox>("lowest_lod_tris"); + return true; } @@ -122,6 +144,14 @@ void LLFloaterObjectWeights::onOpen(const LLSD& key) { refresh(); updateLandImpacts(LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel()); + + onIdleRefresh(this); + gIdleCallbacks.addFunction(onIdleRefresh, this); +} + +void LLFloaterObjectWeights::onClose(bool app_quitting) +{ + gIdleCallbacks.deleteFunction(onIdleRefresh, this); } // virtual @@ -131,8 +161,9 @@ void LLFloaterObjectWeights::onWeightsUpdate(const SelectionCost& selection_cost mSelectedPhysicsWeight->setText(llformat("%.1f", selection_cost.mPhysicsCost)); mSelectedServerWeight->setText(llformat("%.1f", selection_cost.mSimulationCost)); - S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); - mSelectedDisplayWeight->setText(llformat("%d", render_cost)); + // onWeightsUpdate comes from a coroutine. + // Postpone LLSelectMgr operations as getSelectedObjectRenderCost is not coroutine-safe + mWeightsDirty = true; toggleWeightsLoadingIndicators(false); } @@ -152,20 +183,13 @@ void LLFloaterObjectWeights::setErrorStatus(S32 status, const std::string& reaso 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 + // This logic might be a bit too expensive for draw(), + // but this floater needs to react fast, even if it's + // detrimental to performance. Having callbacks like + // 'tris changed' in every selected object might be + // more impactful on performance. 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 + if (!selection->isEmpty() && !mSelectionDirty) { S32 object_lod = -1; bool multiple_lods = false; @@ -192,27 +216,71 @@ void LLFloaterObjectWeights::draw() } } - if (multiple_lods) + if (mSelectionLastTris != total_tris) { - mLodLevel->setText(getString("multiple_lods")); - toggleRenderLoadingIndicators(false); + mSelectionDirty = true; } - else if (object_lod < 0) + else if (mSelectionLastArea != pixel_area) { - // nodes are waiting for data - toggleRenderLoadingIndicators(true); + mSelectionDirty = true; } - else + else if (multiple_lods) { - mLodLevel->setText(getString(lod_strings[object_lod])); - toggleRenderLoadingIndicators(false); + mSelectionDirty |= mSelectionLastLOD != -1; + } + else if (mSelectionLastLOD != object_lod) + { + mSelectionDirty = true; } - mTrianglesShown->setText(llformat("%d", total_tris)); - mPixelArea->setText(llformat("%ld", (S64)pixel_area)); // value capped at 10M } LLFloater::draw(); } +void LLFloaterObjectWeights::onIdleRefresh(void* user_data) +{ + LLFloaterObjectWeights* self = (LLFloaterObjectWeights*)user_data; + + F64 current_time = LLTimer::getTotalSeconds(); + S32 current_lod_requests = LLMeshRepoThread::sActiveLODRequests.load(); + // Can't look for a specific mesh (no callback mechanics and we + // need multiple ones), so just update periodically if something loads + self->mSelectionMeshDirty |= (self->mLastActiveLODRequests > current_lod_requests); + bool throttle_elapsed = (current_time - self->mSelectionRefreshTime) >= 2.0; + + if (self->mLastActiveLODRequests < current_lod_requests) + { + // we are interested in finished downloads, + // so don't refresh if more requests are getting added. + self->mLastActiveLODRequests = current_lod_requests; + } + + if (self->mSelectionDirty) + { + // Always refresh on selection changes + self->refreshDataFromSelection(); + self->mSelectionDirty = false; + self->mSelectionRefreshTime = current_time; + // refreshDataFromSelection could have indirectly initiated more requests + self->mLastActiveLODRequests = LLMeshRepoThread::sActiveLODRequests.load(); + } + else if (self->mSelectionMeshDirty && throttle_elapsed) + { + // LOD requests count changed or mesh needs lod data reload + self->refreshDataFromSelection(); + self->mSelectionRefreshTime = current_time; + self->mSelectionMeshDirty = false; + // refreshDataFromSelection could have indirectly initiated more requests + self->mLastActiveLODRequests = LLMeshRepoThread::sActiveLODRequests.load(); + } + else if (self->mWeightsDirty) // also done in refreshDataFromSelection + { + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + S32 render_cost = selection->getSelectedObjectRenderCost(); + self->mSelectedDisplayWeight->setText(llformat("%d", render_cost)); + self->mWeightsDirty = false; + } +} + void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel) { if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) @@ -240,6 +308,101 @@ void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel) } } +void LLFloaterObjectWeights::refreshDataFromSelection() +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->isEmpty()) + { + const std::string text = getString("nothing_selected"); + mLodLevel->setText(text); + mTrianglesShown->setText(text); + mPixelArea->setText(text); + + mHighLodTris->setText(text); + mMediumLodTris->setText(text); + mLowLodTris->setText(text); + mLowestLodTris->setText(text); + + toggleRenderLoadingIndicators(false); + toggleLODLoadingIndicators(false); + } + else + { + S32 object_lod = -1; + bool multiple_lods = false; + S32 total_tris = 0; + F32 pixel_area = 0; + S32 high_tris = 0; + S32 medium_tris = 0; + S32 low_tris = 0; + S32 lowest_tris = 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(); + object->recursiveGetLODTriangleCount(high_tris, medium_tris, low_tris, lowest_tris); + } + } + + mSelectionLastTris = total_tris; + mSelectionLastArea = pixel_area; + if (multiple_lods) + { + mSelectionLastLOD = -1; + } + else + { + mSelectionLastLOD = object_lod; + } + + if (multiple_lods) + { + mLodLevel->setText(getString("multiple_lods")); + toggleRenderLoadingIndicators(false); + toggleLODLoadingIndicators(false); + } + else if (object_lod < 0) + { + // nodes are waiting for data + toggleRenderLoadingIndicators(true); + toggleLODLoadingIndicators(true); + } + else + { + mLodLevel->setText(getString(lod_strings[object_lod])); + toggleRenderLoadingIndicators(false); + toggleLODLoadingIndicators(false); + } + mTrianglesShown->setText(llformat("%d", total_tris)); + mPixelArea->setText(llformat("%ld", (S64)pixel_area)); // value capped at 10M + mHighLodTris->setText(llformat("%d", high_tris)); + mMediumLodTris->setText(llformat("%d", medium_tris)); + mLowLodTris->setText(llformat("%d", low_tris)); + mLowestLodTris->setText(llformat("%d", lowest_tris)); + } + + if (mWeightsDirty) + { + S32 render_cost = selection->getSelectedObjectRenderCost(); + mSelectedDisplayWeight->setText(llformat("%d", render_cost)); + mWeightsDirty = false; + } +} + void LLFloaterObjectWeights::refresh() { LLSelectMgr* sel_mgr = LLSelectMgr::getInstance(); @@ -341,6 +504,19 @@ void LLFloaterObjectWeights::toggleRenderLoadingIndicators(bool visible) mPixelArea->setVisible(!visible); } +void LLFloaterObjectWeights::toggleLODLoadingIndicators(bool visible) +{ + childSetVisible("high_lod_tris_loading_indicator", visible); + childSetVisible("medium_lod_tris_loading_indicator", visible); + childSetVisible("low_lod_tris_loading_indicator", visible); + childSetVisible("lowest_lod_tris_loading_indicator", visible); + + mHighLodTris->setVisible(!visible); + mMediumLodTris->setVisible(!visible); + mLowLodTris->setVisible(!visible); + mLowestLodTris->setVisible(!visible); +} + void LLFloaterObjectWeights::updateIfNothingSelected() { const std::string text = getString("nothing_selected"); diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index bda625564b..dac87d2a10 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -61,13 +61,17 @@ public: bool postBuild() override; void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; void onWeightsUpdate(const SelectionCost& selection_cost) override; void setErrorStatus(S32 status, const std::string& reason) override; void draw() override; + static void onIdleRefresh(void* user_data); + void updateLandImpacts(const LLParcel* parcel); + void refreshDataFromSelection(); void refresh() override; private: @@ -76,9 +80,19 @@ private: void toggleWeightsLoadingIndicators(bool visible); void toggleLandImpactsLoadingIndicators(bool visible); void toggleRenderLoadingIndicators(bool visible); + void toggleLODLoadingIndicators(bool visible); void updateIfNothingSelected(); + bool mWeightsDirty; + bool mSelectionDirty; + bool mSelectionMeshDirty; + F64 mSelectionRefreshTime; + S32 mSelectionLastLOD; + S32 mSelectionLastTris; + F32 mSelectionLastArea; + S32 mLastActiveLODRequests; + LLTextBox *mSelectedObjects; LLTextBox *mSelectedPrims; @@ -95,6 +109,13 @@ private: LLTextBox *mLodLevel; LLTextBox *mTrianglesShown; LLTextBox *mPixelArea; + + LLTextBox *mHighLodTris; + LLTextBox *mMediumLodTris; + LLTextBox *mLowLodTris; + LLTextBox *mLowestLodTris; + + boost::signals2::scoped_connection mSelectionConnection; }; #endif //LL_LLFLOATEROBJECTWEIGHTS_H diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index cb708050fd..6d86809a1e 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -346,6 +346,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.RememberedUsernames", boost::bind(&LLFloaterPreference::onClickRememberedUsernames, this)); mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this)); mCommitCallbackRegistrar.add("Pref.Advanced", boost::bind(&LLFloaterPreference::onClickAdvanced, this)); + mCommitCallbackRegistrar.add("Pref.Scripting", boost::bind(&LLFloaterPreference::onClickScriptingPerfs, this)); sSkin = gSavedSettings.getString("SkinCurrent"); @@ -774,7 +775,7 @@ void LLFloaterPreference::onOpen(const LLSD& key) updateClickActionViews(); #if LL_LINUX || __FreeBSD__ - // Lixux doesn't support automatic mode + // Lixux doesn't support automatic maose warp mode LLComboBox* combo = getChild<LLComboBox>("mouse_warp_combo"); S32 mode = gSavedSettings.getS32("MouseWarpMode"); if (mode == 0) @@ -1359,7 +1360,7 @@ void LLFloaterPreference::onChangeQuality(const LLSD& data) if (level >= LVL_HIGH && mLastQualityLevel < level) { constexpr U32 LOW_MEM_THRESHOLD = 4097; - U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB(); + U32 total_mem = U32Megabytes(LLMemory::getMaxMemKB()); if (total_mem < LOW_MEM_THRESHOLD) { LLSD args; @@ -1505,7 +1506,7 @@ bool LLFloaterPreference::moveTranscriptsAndLog() //Couldn't move the log and created a new directory so remove the new directory if(madeDirectory) { - LLFile::rmdir(chatLogPath); + LLFile::remove(chatLogPath); } return false; } @@ -1531,7 +1532,7 @@ bool LLFloaterPreference::moveTranscriptsAndLog() if(madeDirectory) { - LLFile::rmdir(chatLogPath); + LLFile::remove(chatLogPath); } return false; @@ -1869,6 +1870,11 @@ void LLFloaterPreference::onClickAdvanced() } } +void LLFloaterPreference::onClickScriptingPerfs() +{ + LLFloaterReg::showInstance("scripting_settings"); +} + void LLFloaterPreference::onClickActionChange() { updateClickActionControls(); @@ -2052,17 +2058,19 @@ void LLFloaterPreference::changed() { if (LLConversationLog::instance().getIsLoggingEnabled()) { - getChild<LLButton>("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0); + 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; + bool has_logs = false; + if (LLConversationLog::instance().getConversations().size() > 0) + { + std::filesystem::path file_path = fsyspath(LLConversationLog::instance().getFileName()); + has_logs = LLFile::isfile(file_path) + && LLFile::size(file_path) > 0; + } getChild<LLButton>("clear_log")->setEnabled(has_logs); } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 33ba28d0dc..ce55fd4e77 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -191,6 +191,7 @@ public: void onClickRenderExceptions(); void onClickAutoAdjustments(); void onClickAdvanced(); + void onClickScriptingPerfs(); void applyUIColor(LLUICtrl* ctrl, const LLSD& param); void getUIColor(LLUICtrl* ctrl, const LLSD& param); void onLogChatHistorySaved(); diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp index a8a1e507a8..8999a84c7e 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -81,7 +81,7 @@ bool LLFloaterPreferenceGraphicsAdvanced::postBuild() } } -#if !LL_DARWIN +#if !LL_DARWIN && !LL_SDL_WINDOW LLCheckBoxCtrl *use_HiDPI = getChild<LLCheckBoxCtrl>("use HiDPI"); use_HiDPI->setVisible(false); #endif @@ -158,7 +158,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refresh() updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail", true), getChild<LLTextBox>("AvatarPhysicsDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail", true), getChild<LLTextBox>("TerrainMeshDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess", true), getChild<LLTextBox>("PostProcessText", true)); - updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail", true), getChild<LLTextBox>("SkyMeshDetailText", true)); + updateSliderText(getChild<LLSliderCtrl>("GlowResolution", true), getChild<LLTextBox>("GlowResolutionText", true)); LLAvatarComplexityControls::setIndirectControls(); setMaxNonImpostorsText( gSavedSettings.getU32("RenderAvatarMaxNonImpostors"), @@ -277,16 +277,11 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText"); LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); - LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); - LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); LLSliderCtrl* cas_slider = getChild<LLSliderCtrl>("RenderSharpness"); // disabled windlight if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) { - sky->setEnabled(false); - sky_text->setEnabled(false); - //deferred needs windlight, disable deferred ctrl_shadows->setEnabled(false); ctrl_shadows->setValue(0); @@ -340,16 +335,16 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() tonemapMix->setEnabled(is_not_vintage); exposureSlider->setEnabled(is_not_vintage); cas_slider->setEnabled(is_not_vintage); + + LLComboBox* ctrl_anisotropic = getChild<LLComboBox>("anisotropic_filter"); + if (!LLFeatureManager::instance().isFeatureAvailable("RenderAnisotropicLevel")) + { + ctrl_anisotropic->setEnabled(false); + } } void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() { - // WindLight - LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); - LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText"); - sky->setEnabled(true); - sky_text->setEnabled(true); - bool enabled = true; LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); @@ -384,6 +379,20 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() getChildView("antialiasing restart")->setVisible(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred")); + LLComboBox* af_combo = getChild<LLComboBox>("anisotropic_filter"); + if (2.f > gGLManager.mMaxAnisotropy) { + af_combo->remove("2x"); + } + if (4.f > gGLManager.mMaxAnisotropy) { + af_combo->remove("4x"); + } + if (8.f > gGLManager.mMaxAnisotropy) { + af_combo->remove("8x"); + } + if (16.f > gGLManager.mMaxAnisotropy) { + af_combo->remove("16x"); + } + // now turn off any features that are unavailable disableUnavailableSettings(); } diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 0036df9c3d..e0f65315d5 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -515,8 +515,8 @@ private: void searchAgent(LLNameListCtrl* listCtrl, const std::string& search_string); void copyListToClipboard(std::string list_name); - bool mPendingUpdate; - bool mCtrlsEnabled; + bool mPendingUpdate = false; + bool mCtrlsEnabled = false; }; #endif diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 7e7eb91636..6322dcd3c9 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -660,9 +660,9 @@ void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::strin } // static -void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description) +void LLFloaterReporter::showFromChatObj(const LLUUID& object_id, const std::string& time, const std::string& description) { - show(avatar_id, avatar_name); + show(object_id, LLStringUtil::null, LLUUID::null); LLStringUtil::format_map_t args; args["[MSG_TIME]"] = time; @@ -671,8 +671,25 @@ void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); if (self) { - std::string description = self->getString("chat_report_format", args); - self->getChild<LLUICtrl>("details_edit")->setValue(description); + std::string description_frmt = self->getString("chat_report_format", args); + self->getChild<LLUICtrl>("details_edit")->setValue(description_frmt); + } +} + +// static +void LLFloaterReporter::showFromChatAv(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description) +{ + show(avatar_id, avatar_name); + + LLStringUtil::format_map_t args; + args["[MSG_TIME]"] = time; + args["[MSG_DESCRIPTION]"] = description; + + LLFloaterReporter* self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); + if (self) + { + std::string description_frmt = self->getString("chat_report_format", args); + self->getChild<LLUICtrl>("details_edit")->setValue(description_frmt); } } diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index 31b05235a6..446e7d63b6 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -93,7 +93,8 @@ public: static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null); static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name); - static void showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description); + static void showFromChatObj(const LLUUID& object_id, const std::string& time, const std::string& description); + static void showFromChatAv(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description); static void showFromExperience(const LLUUID& experience_id); static void onClickSend (void *userdata); diff --git a/indra/newview/llfloaterscripting.cpp b/indra/newview/llfloaterscripting.cpp new file mode 100644 index 0000000000..959d4eaeb4 --- /dev/null +++ b/indra/newview/llfloaterscripting.cpp @@ -0,0 +1,132 @@ +/** + * @file llfloaterscripting.cpp + * @brief Asset creation permission preferences. + * @author Jonathan Yap + * + * $LicenseInfo:firstyear=2001&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 "llcheckboxctrl.h" +#include "llfloaterscripting.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "lluictrlfactory.h" +#include "llpermissions.h" +#include "llagent.h" +#include "llviewerregion.h" +#include "llnotificationsutil.h" +#include "llsdserialize.h" +#include "llvoavatar.h" +#include "llcorehttputil.h" +#include "lleventfilter.h" +#include "lleventcoro.h" +#include "llviewermenufile.h" +#include "llappviewer.h" +#include "llscripteditorws.h" + +namespace +{ + class LLEditorPicker : public LLFilePickerThread + { + public: + LLEditorPicker(LLFloaterScripting *floater): + LLFilePickerThread(LLFilePicker::FFLOAD_EXE) + { + mHandle = floater->getDerivedHandle<LLFloaterScripting>(); + } + void notify(const std::vector<std::string>& filenames) override + { + if (LLAppViewer::instance()->quitRequested()) + { + return; + } + + LLFloaterScripting* floater = mHandle.get(); + if (floater && !filenames.empty()) + { + floater->pickedEditor(filenames.front()); + } + } + + private: + LLHandle<LLFloaterScripting> mHandle; + }; + +} + +LLFloaterScripting::LLFloaterScripting(const LLSD& seed) + : LLFloater(seed) +{ + mCommitCallbackRegistrar.add("ScriptingSettings.CLOSE", boost::bind(&LLFloaterScripting::onClickClose, this)); + mCommitCallbackRegistrar.add("ScriptingSettings.BROWSE", boost::bind(&LLFloaterScripting::onClickBrowse, this)); +} + +bool LLFloaterScripting::postBuild() +{ + // Subscribe to tight integration changes + mTightIntegrationConnection = gSavedSettings.getControl("ExternalEditorTightIntegration")->getSignal()->connect( + boost::bind(&LLFloaterScripting::onTightIntegrationChanged, this)); + + // Apply initial state + onTightIntegrationChanged(); + + return true; +} + +LLFloaterScripting::~LLFloaterScripting() +{ + mTightIntegrationConnection.disconnect(); +} + +void LLFloaterScripting::onTightIntegrationChanged() +{ + bool tight = gSavedSettings.getBOOL("ExternalEditorTightIntegration"); + + // Force websocket on when tight integration is enabled + if (LLScriptEditorWSServer::isTightIntegration()) + { + gSavedSettings.setBOOL("ExternalWebsocketSyncEnable", true); + } + + // Disable websocket checkbox when tight integration is on + getChild<LLCheckBoxCtrl>("websocket_sync_enable")->setEnabled(!tight); +} + +void LLFloaterScripting::onClickClose() +{ + closeFloater(); +} + +void LLFloaterScripting::onClickBrowse() +{ + (new LLEditorPicker(this))->getFile(); +} + +void LLFloaterScripting::pickedEditor(std::string_view editor) +{ + assert_main_thread(); + std::stringstream cmdline; + cmdline << "\"" << editor << "\" \"%s\""; + + gSavedSettings.setString("ExternalEditor", cmdline.str()); +} diff --git a/indra/newview/tests/llsky_stub.cpp b/indra/newview/llfloaterscripting.h index 8faca2665a..cf6b43e88d 100644 --- a/indra/newview/tests/llsky_stub.cpp +++ b/indra/newview/llfloaterscripting.h @@ -1,10 +1,11 @@ /** - * @file llsky_stub.cpp - * @brief stub class to allow unit testing + * @file llfloaterscripting.h + * @brief Asset creation permission preferences. + * @author Jonathan Yap * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * 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 @@ -24,14 +25,29 @@ * $/LicenseInfo$ */ -class LLSky +#pragma once + +#include "llfloater.h" +#include "lleventcoro.h" +#include "llcoros.h" + +class LLFloaterScripting : public LLFloater { + friend class LLFloaterReg; + public: - void setOverrideSun(BOOL override); - void setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity); -}; + bool postBuild() override; + void onClickClose(); + void onClickBrowse(); -void LLSky::setOverrideSun(BOOL override) {} -void LLSky::setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity) {} + void pickedEditor(std::string_view editor); + +private: + LLFloaterScripting(const LLSD& seed); + ~LLFloaterScripting() override; + + void onTightIntegrationChanged(); + + boost::signals2::connection mTightIntegrationConnection; +}; -LLSky gSky; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 83d7a92846..8fa279dace 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -96,13 +96,13 @@ LLSnapshotModel::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloat LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshotBase* floater) { LLPanelSnapshot* active_panel = getActivePanel(floater); - return active_panel ? active_panel->getWidthSpinner() : floater->getChild<LLSpinCtrl>("snapshot_width"); + return active_panel ? active_panel->getWidthSpinner() : floater->findChild<LLSpinCtrl>("snapshot_width"); } LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshotBase* floater) { LLPanelSnapshot* active_panel = getActivePanel(floater); - return active_panel ? active_panel->getHeightSpinner() : floater->getChild<LLSpinCtrl>("snapshot_height"); + return active_panel ? active_panel->getHeightSpinner() : floater->findChild<LLSpinCtrl>("snapshot_height"); } void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshotBase* floater, bool enable) @@ -278,7 +278,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater) LLSpinCtrl* height_ctrl = getHeightSpinner(floater); // Initialize spinners. - if (width_ctrl->getValue().asInteger() == 0) + if (width_ctrl && width_ctrl->getValue().asInteger() == 0) { S32 w = gViewerWindow->getWindowWidthRaw(); LL_DEBUGS() << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << LL_ENDL; @@ -288,7 +288,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater) width_ctrl->setIncrement((F32)(w >> 1)); } } - if (height_ctrl->getValue().asInteger() == 0) + if (height_ctrl && height_ctrl->getValue().asInteger() == 0) { S32 h = gViewerWindow->getWindowHeightRaw(); LL_DEBUGS() << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << LL_ENDL; @@ -686,8 +686,8 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, bool LLSnapshotLivePreview* previewp = getPreviewView(); if (previewp && combobox->getCurrentIndex() >= 0) { - S32 original_width = 0 , original_height = 0 ; - previewp->getSize(original_width, original_height) ; + S32 original_width = 0, original_height = 0; + previewp->getSize(original_width, original_height); if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) { //clamp snapshot resolution to window size when showing UI or HUD in snapshot @@ -737,24 +737,31 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, bool previewp->setSize(width, height); } - checkAspectRatio(view, width) ; + checkAspectRatio(view, width); previewp->getSize(width, height); - // We use the height spinner here because we come here via the aspect ratio - // checkbox as well and we want height always changing to width by default. - // If we use the width spinner we would change width according to height by - // default, that is not what we want. - updateSpinners(view, previewp, width, height, !getHeightSpinner(view)->isDirty()); // may change width and height + LLSpinCtrl* height_ctrl = getHeightSpinner(view); + if (height_ctrl) + { + // We use the height spinner here because we come here via the aspect ratio + // checkbox as well and we want height always changing to width by default. + // If we use the width spinner we would change width according to height by + // default, that is not what we want. + updateSpinners(view, previewp, width, height, !height_ctrl->isDirty()); // may change width and height + } - if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height) + LLSpinCtrl* width_ctrl = getWidthSpinner(view); + if (width_ctrl + && height_ctrl + && (width_ctrl->getValue().asInteger() != width || height_ctrl->getValue().asInteger() != height)) { - getWidthSpinner(view)->setValue(width); - getHeightSpinner(view)->setValue(height); + width_ctrl->setValue(width); + height_ctrl->setValue(height); if (getActiveSnapshotType(view) == LLSnapshotModel::SNAPSHOT_TEXTURE) { - getWidthSpinner(view)->setIncrement((F32)(width >> 1)); - getHeightSpinner(view)->setIncrement((F32)(height >> 1)); + width_ctrl->setIncrement((F32)(width >> 1)); + height_ctrl->setIncrement((F32)(height >> 1)); } } @@ -824,7 +831,7 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshotBase* floater, con } // Update supplied width and height according to the constrain proportions flag; limit them by max_val. -bool LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, bool isWidthChanged, S32 max_value) +bool LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, bool isWidthChanged, S32 max_value) const { S32 w = width ; S32 h = height ; @@ -870,19 +877,31 @@ bool LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3 void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshotBase* view, S32 width, S32 height) { - getWidthSpinner(view)->forceSetValue(width); - getHeightSpinner(view)->forceSetValue(height); + LLSpinCtrl* width_ctrl = getWidthSpinner(view); + LLSpinCtrl* height_ctrl = getHeightSpinner(view); + if (!height_ctrl || !width_ctrl) + { + return; + } + width_ctrl->forceSetValue(width); + height_ctrl->forceSetValue(height); if (getActiveSnapshotType(view) == LLSnapshotModel::SNAPSHOT_TEXTURE) { - getWidthSpinner(view)->setIncrement((F32)(width >> 1)); - getHeightSpinner(view)->setIncrement((F32)(height >> 1)); + width_ctrl->setIncrement((F32)(width >> 1)); + height_ctrl->setIncrement((F32)(height >> 1)); } } void LLFloaterSnapshot::Impl::updateSpinners(LLFloaterSnapshotBase* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, bool is_width_changed) { - getWidthSpinner(view)->resetDirty(); - getHeightSpinner(view)->resetDirty(); + LLSpinCtrl* width_ctrl = getWidthSpinner(view); + LLSpinCtrl* height_ctrl = getHeightSpinner(view); + if (!height_ctrl || !width_ctrl) + { + return; + } + width_ctrl->resetDirty(); + height_ctrl->resetDirty(); if (checkImageSize(previewp, width, height, is_width_changed, previewp->getMaxImageSize())) { setImageSizeSpinnersValues(view, width, height); @@ -903,7 +922,15 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshotBase* view, if (w != curw || h != curh) { //if to upload a snapshot, process spinner input in a special way. - previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ; + LLSpinCtrl* width_ctrl = getWidthSpinner(view); + if (width_ctrl) + { + previewp->setMaxImageSize((S32)width_ctrl->getMaxValue()); + } + else + { + previewp->setMaxImageSize((S32)2048); + } previewp->setSize(w,h); checkAutoSnapshot(previewp, false); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 186d9c41cf..703ce9e57b 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -194,7 +194,7 @@ public: void onImageFormatChange(LLFloaterSnapshotBase* view); void applyCustomResolution(LLFloaterSnapshotBase* view, S32 w, S32 h); static void onSendingPostcardFinished(LLFloaterSnapshotBase* floater, bool status); - bool checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, bool isWidthChanged, S32 max_value); + bool checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, bool isWidthChanged, S32 max_value) const; void setImageSizeSpinnersValues(LLFloaterSnapshotBase *view, S32 width, S32 height); void updateSpinners(LLFloaterSnapshotBase* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, bool is_width_changed); static void onSnapshotUploadFinished(LLFloaterSnapshotBase* floater, bool status); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index af58c6316d..2033ef5ade 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -485,47 +485,47 @@ bool LLFloaterUIPreview::postBuild() bool found_en_us = false; std::string language_directory; std::string xui_dir = get_xui_dir(); // directory containing localizations -- don't forget trailing delim - mLanguageSelection->removeall(); // clear out anything temporarily in list from XML + mLanguageSelection->removeall(); // clear out anything temporarily in list from XML LLDirIterator iter(xui_dir, "*"); - while(found) // for every directory + while (found) // for every directory { - if((found = iter.next(language_directory))) // get next directory + if ((found = iter.next(language_directory))) // get next directory { std::string full_path = gDirUtilp->add(xui_dir, language_directory); - if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it + if (!LLFile::isdir(full_path.c_str())) // if it's not a directory, skip it { continue; } - if(strncmp("template",language_directory.c_str(),8) && -1 == language_directory.find(".")) // if it's not the template directory or a hidden directory + if (strncmp("template",language_directory.c_str(), 8) && -1 == language_directory.find(".")) // if it's not the template directory or a hidden directory { - if(!strncmp("en",language_directory.c_str(),5)) // remember if we've seen en, so we can make it default + if (!strncmp("en",language_directory.c_str(), 5)) // remember if we've seen en, so we can make it default { found_en_us = true; } else { - mLanguageSelection->add(std::string(language_directory)); // add it to the language selection dropdown menu + mLanguageSelection->add(std::string(language_directory)); // add it to the language selection dropdown menu mLanguageSelection_2->add(std::string(language_directory)); } } } } - if(found_en_us) + if (found_en_us) { - mLanguageSelection->add(std::string("en"),ADD_TOP); // make en first item if we found it - mLanguageSelection_2->add(std::string("en"),ADD_TOP); + mLanguageSelection->add(std::string("en"), ADD_TOP); // make en first item if we found it + mLanguageSelection_2->add(std::string("en"), ADD_TOP); } else { std::string warning = std::string("No EN localization found; check your XUI directories!"); popupAndPrintWarning(warning); } - mLanguageSelection->selectFirstItem(); // select the first item + mLanguageSelection->selectFirstItem(); // select the first item mLanguageSelection_2->selectFirstItem(); - refreshList(); // refresh the list of available floaters + refreshList(); // refresh the list of available floaters return true; } @@ -575,7 +575,7 @@ void LLFloaterUIPreview::onClickExportSchema() // std::string file_name(template_path + gDirUtilp->getDirDelimiter() + widget_name + ".rng"); - // LLFILE* rng_file = LLFile::fopen(file_name.c_str(), "w"); + // LLFILE* rng_file = LLFile::fopen(file_name.c_str(), LLFILE_MODE("w")); // { // LLXMLNode::writeHeaderToFile(rng_file); // const bool use_type_decorations = false; @@ -893,8 +893,7 @@ void LLFloaterUIPreview::displayFloater(bool click, S32 ID) // Add localization to title so user knows whether it's localized or defaulted to en std::string full_path = getLocalizedDirectory() + path; std::string floater_lang = "EN"; - llstat dummy; - if(!LLFile::stat(full_path.c_str(), &dummy)) // if the file does not exist + if (LLFile::isfile(full_path.c_str())) // use localized language if the file exists { floater_lang = getLocStr(ID); } @@ -967,9 +966,8 @@ void LLFloaterUIPreview::onClickEditFloater() } file_path = getLocalizedDirectory() + file_name; - // stat file to see if it exists (some localized versions may not have it there are no diffs, and then we try to open an nonexistent file) - llstat dummy; - if(LLFile::stat(file_path.c_str(), &dummy)) // if the file does not exist + // Does it exist? (Some localized versions may not have it when there are no diffs, and then we try to open a nonexistent file) + if (!LLFile::isfile(file_path.c_str())) // if the file does not exist { popupAndPrintWarning("No file for this floater exists in the selected localization. Opening the EN version instead."); file_path = get_xui_dir() + mDelim + "en" + mDelim + file_name; // open the en version instead, by default @@ -1118,15 +1116,14 @@ void LLFloaterUIPreview::onClickToggleDiffHighlighting() std::string path_in_textfield = mDiffPathTextBox->getText(); // get file path bool error = false; - if(std::string("") == path_in_textfield) // check for blank file + if(std::string("") == path_in_textfield) // check for blank file { std::string warning = "Unable to highlight differences because no file was provided; fill in the relevant text field"; popupAndPrintWarning(warning); error = true; } - llstat dummy; - if(LLFile::stat(path_in_textfield.c_str(), &dummy) && !error) // check if the file exists (empty check is reduntant but useful for the informative error message) + if (!LLFile::isfile(path_in_textfield.c_str()) && !error) // check if the file exists (empty check is redundant but useful for the informative error message) { std::string warning = std::string("Unable to highlight differences because an invalid path to a difference file was provided:\"") + path_in_textfield + "\""; popupAndPrintWarning(warning); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 03979edbc1..87a9b91015 100755..100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -419,7 +419,7 @@ bool LLFloaterWorldMap::postBuild() mEventsMatureCheck = getChild<LLCheckBoxCtrl>("events_mature_chk"); mEventsAdultCheck = getChild<LLCheckBoxCtrl>("events_adult_chk"); - mAvatarIcon = getChild<LLUICtrl>("avatar_icon"); + mFriendAvatarIcon = getChild<LLUICtrl>("friends_icon"); mLandmarkIcon = getChild<LLUICtrl>("landmark_icon"); mLocationIcon = getChild<LLUICtrl>("location_icon"); @@ -610,11 +610,11 @@ void LLFloaterWorldMap::draw() LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus(); if (LLTracker::TRACKING_AVATAR == tracking_status) { - mAvatarIcon->setColor( map_track_color); + mFriendAvatarIcon->setColor( map_track_color); } else { - mAvatarIcon->setColor( map_track_disabled_color); + mFriendAvatarIcon->setColor( map_track_disabled_color); } if (LLTracker::TRACKING_LANDMARK == tracking_status) diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 9558ca2615..00b5837df0 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -234,7 +234,7 @@ private: LLCheckBoxCtrl* mEventsMatureCheck = nullptr; LLCheckBoxCtrl* mEventsAdultCheck = nullptr; - LLUICtrl* mAvatarIcon = nullptr; + LLUICtrl* mFriendAvatarIcon = nullptr; LLUICtrl* mLandmarkIcon = nullptr; LLUICtrl* mLocationIcon = nullptr; diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 807ba1b3ed..42446a52a8 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -805,9 +805,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di { pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]); } - LLRender2D::setLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth); - gGL.begin(LLRender::LINES); color.mV[3] *= 0.5f; gGL.color4fv(color.mV); @@ -818,6 +816,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di gGL.end(); LLRender2D::setLineWidth(1.f); + } //----------------------------------------------------------------------------- diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index b784419780..4036544343 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -525,7 +525,7 @@ void LLGLTFMaterialList::onAssetLoadComplete(const LLUUID& id, LLAssetType::ETyp if (status != LL_ERR_NOERR) { - LL_WARNS("GLTF") << "Error getting material asset data: " << LLAssetStorage::getErrorString(status) << " (" << status << ")" << LL_ENDL; + LL_WARNS("GLTF") << "Error getting material asset data: " << LLAssetStorage::getErrorString(status) << " (" << status << ") for asset " << id << LL_ENDL; asset_data->mMaterial->materialComplete(false); delete asset_data; } diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp index 4712b5a5e0..43d30d78ad 100644 --- a/indra/newview/llgltfmaterialpreviewmgr.cpp +++ b/indra/newview/llgltfmaterialpreviewmgr.cpp @@ -430,7 +430,7 @@ bool LLGLTFPreviewTexture::render() glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - LLGLDepthTest(GL_FALSE); + LLGLDepthTest depth(GL_FALSE); LLGLDisable stencil(GL_STENCIL_TEST); LLGLDisable scissor(GL_SCISSOR_TEST); SetTemporarily<bool> no_dof(&LLPipeline::RenderDepthOfField, false); @@ -527,7 +527,6 @@ bool LLGLTFPreviewTexture::render() if (hdr) { - gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap); gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap); gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false); /* @@ -542,8 +541,6 @@ bool LLGLTFPreviewTexture::render() /* gPipeline.generateGlow(&gPipeline.mPostPingMap); gPipeline.combineGlow(&gPipeline.mPostPingMap, &screen); - gPipeline.renderDoF(&screen, &gPipeline.mPostPingMap); - gPipeline.applyFXAA(&gPipeline.mPostPingMap, &screen); */ gPipeline.generateGlow(&gPipeline.mPostMaps[activeRT]); @@ -565,9 +562,7 @@ bool LLGLTFPreviewTexture::render() gPipeline.copyRenderTarget(&gPipeline.mPostMaps[activeRT], &screen); - // Final render - gDeferredPostNoDoFProgram.bind(); // From LLPipeline::renderFinalize: "Whatever is last in the above post processing chain should _always_ be rendered directly here. If not, expect problems." diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 94b6cc3bb7..6081b36918 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -869,7 +869,6 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer) { return; } - observer_multimap_t::iterator it = mObservers.lower_bound(observer->getID()); observer_multimap_t::iterator end = mObservers.upper_bound(observer->getID()); for (; it != end; ++it) diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 4327d281e5..5d20e722de 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -41,9 +41,9 @@ #include "llhudrender.h" #include "llui.h" #include "llviewercamera.h" +#include "llviewerregion.h" #include "llviewertexturelist.h" #include "llviewerobject.h" -#include "llvovolume.h" #include "llviewerwindow.h" #include "llstatusbar.h" #include "llmenugl.h" @@ -291,7 +291,22 @@ void LLHUDNameTag::renderText() + (x_pixel_vec * screen_offset.mV[VX]) + (y_pixel_vec * screen_offset.mV[VY]); - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + // Check if an underwater name tag should be rendered over the water (while camera is above the water) + bool render_over_water = false; + static LLCachedControl<bool> nametag_over_water(gSavedSettings, "NametagOverWater", true); + if (nametag_over_water && + mSourceObject && + mSourceObject->getRegion() && + LLPipeline::sRenderTransparentWater && + !LLViewerCamera::getInstance()->cameraUnderWater()) + { + if (mSourceObject->getPositionAgent().mV[VZ] < mSourceObject->getRegion()->getWaterHeight()) + { + render_over_water = true; + } + } + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, render_over_water ? GL_ALWAYS : GL_LEQUAL); + LLRect screen_rect; screen_rect.setCenterAndSize(0, static_cast<S32>(lltrunc(-mHeight / 2 + mOffsetY)), static_cast<S32>(lltrunc(mWidth)), static_cast<S32>(lltrunc(mHeight))); mRoundedRectImgp->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color); diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index 54d17be370..9fafb2685a 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -1583,7 +1583,8 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url) if (!contents.size()) { - LL_WARNS("Messaging") << "No contents received for offline messages via capability " << url << LL_ENDL; + // Received no offline messages on login. + LL_INFOS("Messaging") << "No contents received for offline messages via capability " << url << LL_ENDL; return; } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 0a260b9916..9aba011a5c 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3248,8 +3248,9 @@ void LLIMMgr::addMessage( return; } - // Fetch group chat history, enabled by default. - if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) + // Fetch group chat or ad-hoc history, enabled by default. + static LLCachedControl<bool> fetch_chat_history(gSavedPerAccountSettings, "FetchGroupChatHistory", true); + if (fetch_chat_history && !session->isP2PSessionType()) { std::string chat_url = gAgent.getRegionCapability("ChatSessionRequest"); if (!chat_url.empty()) @@ -4092,8 +4093,9 @@ public: { im_floater->processSessionUpdate(body["session_info"]); - // Send request for chat history, if enabled. - if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) + // Send request for chat history, if enabled. Skip for peer-to-peer IMs. + static LLCachedControl<bool> fetch_chat_history(gSavedPerAccountSettings, "FetchGroupChatHistory", true); + if (fetch_chat_history && !im_floater->isP2PSessionType()) { std::string url = gAgent.getRegionCapability("ChatSessionRequest"); if (!url.empty()) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 7605887f6c..5686305295 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -249,11 +249,27 @@ const std::string& LLInvFVBridge::getName() const const std::string& LLInvFVBridge::getDisplayName() const { - if(mDisplayName.empty()) + if(mSearchableName.empty()) { - buildDisplayName(); + // first request of display name, build search string and cache it for later use + buildSearchableName(); } - return mDisplayName; + + LLInventoryModel* model = getInventoryModel(); + if (model) + { + LLViewerInventoryCategory* cat = model->getCategory(mUUID); + if (cat) + { + return cat->getDisplayName(); + } + LLViewerInventoryItem* item = model->getItem(mUUID); + if (item) + { + return item->getName(); + } + } + return LLStringUtil::null; } std::string LLInvFVBridge::getSearchableDescription() const @@ -2035,22 +2051,22 @@ PermissionMask LLItemBridge::getPermissionMask() const } // virtual -void LLItemBridge::buildDisplayName() const +void LLItemBridge::buildSearchableName() const { - if (getItem()) + LLViewerInventoryItem* item = getItem(); + if (item) { - mDisplayName.assign(getItem()->getName()); + // for items, display name matches item name + mSearchableName.assign(item->getName()); } else { - mDisplayName.assign(LLStringUtil::null); + mSearchableName.assign(LLStringUtil::null); } - - mSearchableName.assign(mDisplayName); mSearchableName.append(getLabelSuffix()); LLStringUtil::toUpper(mSearchableName); - // Name set, so trigger a sort + // Searchable and name set, so trigger a sort LLInventorySort sorter = static_cast<LLFolderViewModelInventory&>(mRootViewModel).getSorter(); if (mParent && !sorter.isByDate()) { @@ -2371,39 +2387,17 @@ void LLFolderBridge::selectItem() } } -void LLFolderBridge::buildDisplayName() const +void LLFolderBridge::buildSearchableName() const { - LLFolderType::EType preferred_type = getPreferredType(); - - // *TODO: to be removed when database supports multi language. This is a - // temporary attempt to display the inventory folder in the user locale. - // mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID - // it uses the same way to find localized string - - // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder) - // Translation of Accessories folder in Library inventory folder - bool accessories = false; - if(getName() == "Accessories") + LLViewerInventoryCategory* cat = gInventory.getCategory(getUUID()); + if (cat) { - //To ensure that Accessories folder is in Library we have to check its parent folder. - //Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model - LLInventoryCategory* cat = gInventory.getCategory(getUUID()); - if(cat) - { - const LLUUID& parent_folder_id = cat->getParentUUID(); - accessories = (parent_folder_id == gInventory.getLibraryRootFolderID()); - } + mSearchableName.assign(cat->getDisplayName()); } - - //"Accessories" inventory category has folder type FT_NONE. So, this folder - //can not be detected as protected with LLFolderType::lookupIsProtectedType - mDisplayName.assign(getName()); - if (accessories || LLFolderType::lookupIsProtectedType(preferred_type)) + else { - LLTrans::findString(mDisplayName, std::string("InvFolder ") + getName(), LLSD()); + mSearchableName.assign(LLStringUtil::null); } - - mSearchableName.assign(mDisplayName); mSearchableName.append(getLabelSuffix()); LLStringUtil::toUpper(mSearchableName); @@ -2417,6 +2411,8 @@ void LLFolderBridge::buildDisplayName() const std::string LLFolderBridge::getLabelSuffix() const { + // Folders, unlike items, have context dependent suffixes + // that may change as the folder is loaded static LLCachedControl<bool> xui_debug(gSavedSettings, "DebugShowXUINames", 0); if (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= FOLDER_LOADING_MESSAGE_DELAY) @@ -4140,6 +4136,17 @@ void LLFolderBridge::perform_pasteFromClipboard() } else { + // Check that no folder is being pasted into itself or into one of its descendants + for (const LLUUID& item_id : objects) + { + LLInventoryCategory* cat = model->getCategory(item_id); + if (cat && (item_id == mUUID || model->isObjectDescendentOf(mUUID, item_id))) + { + LLNotificationsUtil::add("CannotPasteFolderIntoSelf"); + return; + } + } + // Check that all items can be moved into that folder : for the moment, only stock folder mismatch is checked for (std::vector<LLUUID>::const_iterator iter = objects.begin(); iter != objects.end(); ++iter) { @@ -6578,18 +6585,29 @@ void LLCallingCardBridge::refreshFolderViewItem() void LLCallingCardBridge::checkSearchBySuffixChanges() { - if (!mDisplayName.empty()) + if (!mSearchableName.empty()) { - // changes in mDisplayName are processed by rename function and here it will be always same + LLViewerInventoryItem* item = getItem(); + if (!item) + { + // checkSearchBySuffixChanges is only used by friend list + // so if item is not found, we removed the calling card or + // are no longer friends. + mSearchableName.clear(); + return; + } + + // changes in display name are processed by rename function and here it will be always same // suffixes are also of fixed length, and we are processing change of one at a time, // so it should be safe to use length (note: mSearchableName is capitalized) - auto old_length = mSearchableName.length(); - auto new_length = mDisplayName.length() + getLabelSuffix().length(); + size_t old_length = mSearchableName.length(); + const std::string& display_name = item->getName(); + size_t new_length = display_name.length() + getLabelSuffix().length(); if (old_length == new_length) { return; } - mSearchableName.assign(mDisplayName); + mSearchableName.assign(display_name); mSearchableName.append(getLabelSuffix()); LLStringUtil::toUpper(mSearchableName); if (new_length<old_length) @@ -7198,8 +7216,8 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) item = (LLViewerInventoryItem*)gInventory.getItem(object_id); if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) { - static LLCachedControl<bool> replace_item(gSavedSettings, "InventoryAddAttachmentBehavior", false); - rez_attachment(item, NULL, ("attach" == action) ? replace_item() : true); // Replace if "Wear"ing. + static LLCachedControl<U32> add_attachment_behavior(gSavedSettings, "InventoryAddAttachmentBehavior", 0); + rez_attachment(item, NULL, ("attach" == action) ? (add_attachment_behavior() == 1) : true); // Replace if "Wear"ing. } else if(item && item->isFinished()) { @@ -7467,7 +7485,7 @@ bool LLObjectBridge::renameItem(const std::string& new_name) new_item->updateServer(false); model->updateItem(new_item); model->notifyObservers(); - buildDisplayName(); + buildSearchableName(); if (isAgentAvatarValid()) { @@ -7490,6 +7508,15 @@ bool LLObjectBridge::renameItem(const std::string& new_name) // | LLLSLTextBridge | // +=================================================+ +LLUIImagePtr LLLSLTextBridge::getIcon() const +{ + // Pass the item's flags so the script subtype (e.g. SST_LUA) is honored + // and the correct icon (Inv_Script vs Inv_Script_Luau) is selected. + LLInventoryItem* item = getItem(); + U32 misc_flag = item ? item->getFlags() : 0; + return LLInventoryIcon::getIcon(LLAssetType::AT_LSL_TEXT, LLInventoryType::IT_LSL, misc_flag, false); +} + void LLLSLTextBridge::openItem() { LLViewerInventoryItem* item = getItem(); @@ -8347,8 +8374,8 @@ void LLObjectBridgeAction::attachOrDetach() } else { - static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryAddAttachmentBehavior", false); - LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, inventory_linking()); // Don't replace if adding. + static LLCachedControl<U32> add_attachment_behavior(gSavedSettings, "InventoryAddAttachmentBehavior", 0); + LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, add_attachment_behavior() == 1); // Don't replace if adding. } } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index decb2c0528..ae012c3451 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -87,7 +87,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 clearSearchableName() { mSearchableName.clear(); } virtual void restoreItem() {} virtual void restoreToWorld() {} @@ -202,12 +202,11 @@ protected: LLInventoryType::EType mInvType; bool mIsLink; LLTimer mTimeSinceRequestStart; - mutable std::string mDisplayName; mutable std::string mSearchableName; void purgeItem(LLInventoryModel *model, const LLUUID &uuid); void removeObject(LLInventoryModel *model, const LLUUID &uuid); - virtual void buildDisplayName() const {} + virtual void buildSearchableName() const {} }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -266,7 +265,7 @@ public: protected: bool confirmRemoveItem(const LLSD& notification, const LLSD& response); virtual bool isItemPermissive() const; - virtual void buildDisplayName() const; + virtual void buildSearchableName() const; void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb); private: @@ -287,7 +286,7 @@ public: void callback_dropItemIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryItem* inv_item); void callback_dropCategoryIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryCategory* inv_category); - virtual void buildDisplayName() const; + virtual void buildSearchableName() const; virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); @@ -572,6 +571,7 @@ public: LLFolderView* root, const LLUUID& uuid ) : LLItemBridge(inventory, root, uuid) {} + virtual LLUIImagePtr getIcon() const; virtual void openItem(); }; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index c0164e04e4..6ff1c4839f 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -208,12 +208,14 @@ public: Optional<FilterOps::Params> filter_ops; Optional<std::string> substring; Optional<bool> since_logoff; + Optional<S32> order; Params() : name("name"), filter_ops(""), substring("substring"), - since_logoff("since_logoff") + since_logoff("since_logoff"), + order("order") {} }; diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index ff7cab0ee3..688e7d7c77 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -336,13 +336,13 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata) } else if ("copy_slurl" == action) { - boost::function<void(LLLandmark*)> copy_slurl_cb = [](LLLandmark* landmark) + std::function<void(LLLandmark*)> copy_slurl_cb = [](LLLandmark* landmark) { LLVector3d global_pos; landmark->getGlobalPos(global_pos); if (!global_pos.isExactlyZero()) { - boost::function<void(std::string& slurl)> copy_slurl_to_clipboard_cb = [](const std::string& slurl) + std::function<void(std::string& slurl)> copy_slurl_to_clipboard_cb = [](const std::string& slurl) { gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); LLSD args; diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 94b8c4bebf..64e142212d 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -101,6 +101,8 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryType::ICONNAME_MATERIAL, new IconEntry("Inv_Material")); + addEntry(LLInventoryType::ICONNAME_SCRIPT_LUAU, new IconEntry("Inv_Script_Luau")); + addEntry(LLInventoryType::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); addEntry(LLInventoryType::ICONNAME_UNKNOWN, new IconEntry("Inv_Unknown")); @@ -150,7 +152,7 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type, case LLAssetType::AT_SCRIPT: case LLAssetType::AT_LSL_TEXT: case LLAssetType::AT_LSL_BYTECODE: - idx = LLInventoryType::ICONNAME_SCRIPT; + idx = assignScriptIcon(misc_flag); break; case LLAssetType::AT_CLOTHING: case LLAssetType::AT_BODYPART: @@ -209,3 +211,13 @@ LLInventoryType::EIconName LLInventoryIcon::assignSettingsIcon(U32 misc_flag) LLSettingsType::type_e settings_type = LLSettingsType::fromInventoryFlags(misc_flag); return LLSettingsType::getIconName(settings_type); } + +LLInventoryType::EIconName LLInventoryIcon::assignScriptIcon(U32 misc_flag) +{ + U8 subtype = misc_flag & LLInventoryItemFlags::II_FLAGS_SUBTYPE_MASK; + if (subtype == SST_LUA) + { + return LLInventoryType::ICONNAME_SCRIPT_LUAU; + } + return LLInventoryType::ICONNAME_SCRIPT; +} diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h index 32e2d8b29d..3d2ecb43f2 100644 --- a/indra/newview/llinventoryicon.h +++ b/indra/newview/llinventoryicon.h @@ -49,6 +49,7 @@ public: protected: static LLInventoryType::EIconName assignWearableIcon(U32 misc_flag); static LLInventoryType::EIconName assignSettingsIcon(U32 misc_flag); + static LLInventoryType::EIconName assignScriptIcon(U32 misc_flag); }; #endif // LL_LLINVENTORYICON_H diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 2657f11d0e..b818a66b30 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -28,6 +28,7 @@ #include <typeinfo> #include <random> +#include <thread> #include "llinventorymodel.h" @@ -82,6 +83,7 @@ const S32 LLInventoryModel::sCurrentInvCacheVersion = 5; bool LLInventoryModel::sFirstTimeInViewer2 = true; S32 LLInventoryModel::sPendingSystemFolders = 0; +static std::vector<std::thread> sPendingCacheThreads; ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -100,45 +102,6 @@ struct InventoryIDPtrLess } }; -class LLCanCache : public LLInventoryCollectFunctor -{ -public: - LLCanCache(LLInventoryModel* model) : mModel(model) {} - virtual ~LLCanCache() {} - virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); -protected: - LLInventoryModel* mModel; - std::set<LLUUID> mCachedCatIDs; -}; - -bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - bool rv = false; - if(item) - { - if(mCachedCatIDs.find(item->getParentUUID()) != mCachedCatIDs.end()) - { - rv = true; - } - } - else if(cat) - { - // HACK: downcast - LLViewerInventoryCategory* c = (LLViewerInventoryCategory*)cat; - if(c->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN) - { - S32 descendents_server = c->getDescendentCount(); - S32 descendents_actual = c->getViewerDescendentCount(); - if(descendents_server == descendents_actual) - { - mCachedCatIDs.insert(c->getUUID()); - rv = true; - } - } - } - return rv; -} - struct InventoryCallbackInfo { InventoryCallbackInfo(U32 callback, const LLUUID& inv_id) : @@ -467,30 +430,33 @@ LLInventoryModel::~LLInventoryModel() void LLInventoryModel::cleanupInventory() { + LL_PROFILE_ZONE_SCOPED; empty(); - // Deleting one observer might erase others from the list, so always pop off the front - while (!mObservers.empty()) + // Deleting one observer might trigger removeObserver, so use a local copy + if (!mObservers.empty()) { - observer_list_t::iterator iter = mObservers.begin(); - LLInventoryObserver* observer = *iter; - mObservers.erase(iter); - delete observer; + observer_list_t observers_to_delete; + observers_to_delete.swap(mObservers); + + for (LLInventoryObserver* observer : observers_to_delete) + { + delete observer; + } } if (mBulkFecthCallbackSlot.connected()) { mBulkFecthCallbackSlot.disconnect(); } - mObservers.clear(); // Run down HTTP transport mHttpHeaders.reset(); mHttpOptions.reset(); delete mHttpRequestFG; - mHttpRequestFG = NULL; + mHttpRequestFG = nullptr; delete mHttpRequestBG; - mHttpRequestBG = NULL; + mHttpRequestBG = nullptr; } // This is a convenience function to check if one object has a parent @@ -2369,22 +2335,101 @@ void LLInventoryModel::cache( const LLUUID& parent_folder_id, const LLUUID& agent_id) { + LL_PROFILE_ZONE_SCOPED; LL_DEBUGS(LOG_INV) << "Caching " << parent_folder_id << " for " << agent_id << LL_ENDL; + LLViewerInventoryCategory* root_cat = getCategory(parent_folder_id); - if(!root_cat) return; + if (!root_cat) + { + LL_WARNS(LOG_INV) << "Root category not found for " << parent_folder_id << LL_ENDL; + return; + } + cat_array_t categories; categories.push_back(root_cat); item_array_t items; - LLCanCache can_cache(this); - can_cache(root_cat, NULL); - collectDescendentsIf( - parent_folder_id, - categories, - items, - INCLUDE_TRASH, - can_cache); + // Lambda to check if a category should be cached + // Only cache if it has known version and matching descendent counts + auto should_cache_category = [](LLViewerInventoryCategory* cat) -> bool { + if (!cat || cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + { + return false; + } + S32 descendents_server = cat->getDescendentCount(); + S32 descendents_actual = cat->getViewerDescendentCount(); + return (descendents_server == descendents_actual); + }; + + // Track which folders we've verified as cacheable descendants + std::unordered_set<LLUUID> processed_folders; + processed_folders.insert(parent_folder_id); + + // First pass: identify all cacheable descendant folders + // Use pair of (folder_id, should_save_children) + std::deque<std::pair<LLUUID, bool>> folders_to_check; + folders_to_check.push_back(std::make_pair(parent_folder_id, should_cache_category(root_cat))); + + while (!folders_to_check.empty()) + { + auto [current_id, save_children] = folders_to_check.front(); + folders_to_check.pop_front(); + + if (save_children) // else incorrect count or version + { + auto item_it = mParentChildItemTree.find(current_id); + if (item_it != mParentChildItemTree.end() && item_it->second) + { + for (LLViewerInventoryItem* item : *(item_it->second)) + { + if (item) + { + items.push_back(item); + } + } + } + } + + // Get child categories directly from the parent-child tree + auto cat_it = mParentChildCategoryTree.find(current_id); + if (cat_it != mParentChildCategoryTree.end() && cat_it->second) + { + for (LLViewerInventoryCategory* child_cat : *(cat_it->second)) + { + if (!child_cat) + { + continue; + } + + // Verify ownership matches (library vs agent inventory) + if (child_cat->getOwnerID() != root_cat->getOwnerID()) + { + LL_WARNS(LOG_INV) << "Owner mismatch in category tree: expected " + << root_cat->getOwnerID() << " got " + << child_cat->getOwnerID() << " for category " + << child_cat->getName() << LL_ENDL; + continue; + } + + const LLUUID& child_id = child_cat->getUUID(); + + // Only process each folder once + if (processed_folders.insert(child_id).second) + { + if (should_cache_category(child_cat)) + { + categories.push_back(child_cat); + folders_to_check.push_back(std::make_pair(child_id, true)); + } + else + { + folders_to_check.push_back(std::make_pair(child_id, false)); + } + } + } + } + } if (categories.empty() && items.empty()) { @@ -2403,17 +2448,70 @@ void LLInventoryModel::cache( } std::string gzip_filename = getInvCacheAddres(agent_id); gzip_filename.append(".gz"); - if(gzip_file(temp_file, gzip_filename)) + + if (sPendingCacheThreads.empty()) { - LL_DEBUGS(LOG_INV) << "Successfully compressed " << temp_file << " to " << gzip_filename << LL_ENDL; - LLFile::remove(temp_file); + LL_INFOS(LOG_INV) << "Inventory cache compression started" << LL_ENDL; } - else + + // Launch background packing thread + // Main thread is the only one modifying sPendingCacheThreads + auto compress_cache = [temp_file, gzip_filename]() { - LL_WARNS(LOG_INV) << "Unable to compress " << temp_file << " into " << gzip_filename << LL_ENDL; + LL_PROFILE_ZONE_NAMED("inv cache compression"); + LLTimer gzip_timer; + + if (gzip_file(temp_file, gzip_filename)) + { + F32 gzip_time = gzip_timer.getElapsedTimeF32(); + LL_DEBUGS(LOG_INV) << "Successfully compressed " << temp_file + << " to " << gzip_filename + << " in " << gzip_time << "s" << LL_ENDL; + LLFile::remove(temp_file); + } + else + { + LL_WARNS(LOG_INV) << "Unable to compress " << temp_file + << " into " << gzip_filename << LL_ENDL; + } + }; + + try + { + sPendingCacheThreads.emplace_back(compress_cache); + } + catch (...) + { + LL_WARNS(LOG_INV) << "Failed to start inventory cache compression thread; running compression synchronously" << LL_ENDL; + compress_cache(); } } +void LLInventoryModel::waitForPendingCacheWrites() +{ + if (sPendingCacheThreads.empty()) + { + return; + } + LL_PROFILE_ZONE_SCOPED; + + // By this point all threads should have already been added, + // viewer is shutting down, main thread is the only one to + // modify sPendingCacheThreads + LL_DEBUGS(LOG_INV) << "Waiting for " << sPendingCacheThreads.size() + << " inventory cache compression thread(s) to complete..." << LL_ENDL; + + for (auto& thread : sPendingCacheThreads) + { + if (thread.joinable()) + { + thread.join(); + } + } + sPendingCacheThreads.clear(); + + LL_INFOS(LOG_INV) << "Inventory cache compression completed" << LL_ENDL; +} void LLInventoryModel::addCategory(LLViewerInventoryCategory* category) { @@ -2721,10 +2819,11 @@ bool LLInventoryModel::loadSkeleton( for(LLSD::array_const_iterator it = options.beginArray(), end = options.endArray(); it != end; ++it) { - LLSD name = (*it)["name"]; - LLSD folder_id = (*it)["folder_id"]; - LLSD parent_id = (*it)["parent_id"]; - LLSD version = (*it)["version"]; + const LLSD &folder = *it; + const LLSD &name = folder["name"]; + const LLSD &folder_id = folder["folder_id"]; + const LLSD &parent_id = folder["parent_id"]; + const LLSD &version = folder["version"]; if(name.isDefined() && folder_id.isDefined() && parent_id.isDefined() @@ -2738,7 +2837,7 @@ bool LLInventoryModel::loadSkeleton( cat->setParent(parent_id.asUUID()); LLFolderType::EType preferred_type = LLFolderType::FT_NONE; - LLSD type_default = (*it)["type_default"]; + const LLSD &type_default = folder["type_default"]; if(type_default.isDefined()) { preferred_type = (LLFolderType::EType)type_default.asInteger(); @@ -2768,7 +2867,7 @@ bool LLInventoryModel::loadSkeleton( const S32 NO_VERSION = LLViewerInventoryCategory::VERSION_UNKNOWN; std::string gzip_filename(inventory_filename); gzip_filename.append(".gz"); - LLFILE* fp = LLFile::fopen(gzip_filename, "rb"); + LLFILE* fp = LLFile::fopen(gzip_filename, LLFILE_MODE("rb")); bool remove_inventory_file = false; if (LLAppViewer::instance()->isSecondInstance()) { @@ -3466,6 +3565,8 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, const LLSD& llsd_cats = inventory["categories"]; if (llsd_cats.isArray()) { + size_t cats_count = llsd_cats.size(); + categories.reserve(cats_count); LLSD::array_const_iterator iter = llsd_cats.beginArray(); LLSD::array_const_iterator end = llsd_cats.endArray(); for (; iter != end; ++iter) @@ -3484,6 +3585,8 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, const LLSD& llsd_items = inventory["items"]; if (llsd_items.isArray()) { + size_t items_count = llsd_items.size(); + items.reserve(items_count); LLSD::array_const_iterator iter = llsd_items.beginArray(); LLSD::array_const_iterator end = llsd_items.endArray(); for (; iter != end; ++iter) @@ -4963,7 +5066,7 @@ bool decompress_file(const char* src_filename, const char* dst_filename) // open the files src = gzopen(src_filename, "rb"); if(!src) goto err_decompress; - dst = LLFile::fopen(dst_filename, "wb"); + dst = LLFile::fopen(dst_filename, LLFILE_MODE("wb")); if(!dst) goto err_decompress; // decompress. diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 3aaba69a60..6ac307dd68 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -199,6 +199,9 @@ public: // Call on logout to save a terse representation. void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); + + // Wait for any pending async cache operations to complete + static void waitForPendingCacheWrites(); private: // Information for tracking the actual inventory. We index this // information in a lot of different ways so we can access diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 99cb9ec811..dbafc6fcb6 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -183,7 +183,7 @@ protected: item_ref_t mAddedItems; item_ref_t mWatchedAssets; -private: +protected: bool mIsDirty; }; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 039567ea76..026b8b5008 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -199,7 +199,6 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id ) p.title = getLabel(); p.rect = LLRect(0, 0, getRect().getWidth(), 0); p.parent_panel = this; - p.tool_tip = p.name; p.listener = mInvFVBridgeBuilder->createBridge( LLAssetType::AT_CATEGORY, LLAssetType::AT_CATEGORY, LLInventoryType::IT_CATEGORY, @@ -582,8 +581,9 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem(); if(bridge) { - // Clear the display name first, so it gets properly re-built during refresh() - bridge->clearDisplayName(); + // Clear the searchable name first, so it gets + // properly re-built during refresh() + bridge->clearSearchableName(); view_item->refresh(); } @@ -1064,10 +1064,20 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br { LLFolderViewFolder::Params params(mParams.folder); - params.name = bridge->getDisplayName(); +#ifndef LL_RELEASE_FOR_DOWNLOAD + // Only usable for debug and first call has a large + // overhead from search string construction. + // As inventory names aren't unique and can change, + // there is little we can use them for in release builds. + params.name = bridge->getName(); +#else + // We don't have a source of unique names and inventory + // items can reach millions in quantity, just use + // a short descriptor + params.name = "fld"; +#endif params.root = mFolderRoot.get(); params.listener = bridge; - params.tool_tip = params.name; params.allow_drop = allow_drop; params.font_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultColor); @@ -1080,12 +1090,23 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge { LLFolderViewItem::Params params(mParams.item); - params.name = bridge->getDisplayName(); +#ifndef LL_RELEASE_FOR_DOWNLOAD + // Only usable for debug and first call has a large + // overhead from search string construction. + // As inventory names aren't unique, are large and can change, + // there is little we can use them for in release builds. + // Prefer shorter + params.name = bridge->getName(); +#else + // We don't have a source of unique names and inventory + // items can reach millions in quantity, just use + // a short descriptor + params.name = "itm"; +#endif params.creation_date = bridge->getCreationDate(); params.root = mFolderRoot.get(); params.listener = bridge; params.rect = LLRect (0, 0, 0, 0); - params.tool_tip = params.name; params.font_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultColor); params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultHighlightColor); @@ -1677,7 +1698,7 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it LLFolderBridge* prev_bridge = (LLFolderBridge*)prev_folder_item->getViewModelItem(); if(prev_bridge) { - prev_bridge->clearDisplayName(); + prev_bridge->clearSearchableName(); prev_bridge->setShowDescendantsCount(false); prev_folder_item->refresh(); } @@ -1686,7 +1707,7 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getViewModelItem(); if(bridge) { - bridge->clearDisplayName(); + bridge->clearSearchableName(); bridge->setShowDescendantsCount(true); folder_item->refresh(); mPreviousSelectedFolder = bridge->getUUID(); @@ -1701,7 +1722,7 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it LLFolderBridge* prev_bridge = (LLFolderBridge*)prev_folder_item->getViewModelItem(); if(prev_bridge) { - prev_bridge->clearDisplayName(); + prev_bridge->clearSearchableName(); prev_bridge->setShowDescendantsCount(false); prev_folder_item->refresh(); } @@ -1721,7 +1742,7 @@ void LLInventoryPanel::updateFolderLabel(const LLUUID& folder_id) LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getViewModelItem(); if(bridge) { - bridge->clearDisplayName(); + bridge->clearSearchableName(); bridge->setShowDescendantsCount(true); folder_item->refresh(); } diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp index 666ab4f5d0..c082c632f1 100644 --- a/indra/newview/llkeyconflict.cpp +++ b/indra/newview/llkeyconflict.cpp @@ -575,7 +575,7 @@ void LLKeyConflictHandler::saveToSettings(bool temporary) // Write the resulting XML to file if (!output_node->isNull()) { - LLFILE *fp = LLFile::fopen(filename, "w"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("w")); if (fp != NULL) { LLXMLNode::writeHeaderToFile(fp); diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 1329b1308d..3567ca8e4a 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -31,10 +31,6 @@ /* own header */ #include "lllocalbitmaps.h" -/* boost: will not compile unless equivalent is undef'd, beware. */ -#include "fix_macros.h" -#include <boost/filesystem.hpp> - /* image compression headers. */ #include "llimagebmp.h" #include "llimagetga.h" @@ -42,11 +38,8 @@ #include "llimagejpeg.h" #include "llimagepng.h" -/* time headers */ -#include <time.h> -#include <ctime> - /* misc headers */ +#include "fsyspath.h" #include "llgltfmaterial.h" #include "llscrolllistctrl.h" #include "lllocaltextureobject.h" @@ -192,15 +185,8 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate) if (gDirUtilp->fileExists(mFilename)) { // verifying that the file has indeed been modified - -#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(ll_convert<std::wstring>(mFilename))); -#endif - LLSD new_last_modified = asctime(localtime(&temp_time)); - - if (mLastModified.asString() != new_last_modified.asString()) + const std::filesystem::file_time_type new_last_modified = std::filesystem::last_write_time(fsyspath(mFilename)); + if (mLastModified != new_last_modified) { /* loading the image file and decoding it, here is a critical point which, if fails, invalidates the whole update (or unit creation) process. */ diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index 6c9d65e3b6..c4aaeae719 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -32,6 +32,7 @@ #include "lleventtimer.h" #include "llpointer.h" #include "llwearabletype.h" +#include <filesystem> class LLScrollListCtrl; class LLImageRaw; @@ -99,7 +100,7 @@ class LLLocalBitmap LLUUID mTrackingID; LLUUID mWorldID; bool mValid; - LLSD mLastModified; + std::filesystem::file_time_type mLastModified; EExtension mExtension; ELinkStatus mLinkStatus; S32 mUpdateRetries; diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp index d6facad23d..e9f2299be7 100644 --- a/indra/newview/lllocalgltfmaterials.cpp +++ b/indra/newview/lllocalgltfmaterials.cpp @@ -30,15 +30,8 @@ /* own header */ #include "lllocalgltfmaterials.h" -/* boost: will not compile unless equivalent is undef'd, beware. */ -#include "fix_macros.h" -#include <boost/filesystem.hpp> - -/* time headers */ -#include <time.h> -#include <ctime> - /* misc headers */ +#include "fsyspath.h" #include "llgltfmateriallist.h" #include "llimage.h" #include "llinventoryicon.h" @@ -130,15 +123,8 @@ bool LLLocalGLTFMaterial::updateSelf() if (gDirUtilp->fileExists(mFilename)) { // verifying that the file has indeed been modified - -#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(ll_convert<std::wstring>(mFilename))); -#endif - LLSD new_last_modified = asctime(localtime(&temp_time)); - - if (mLastModified.asString() != new_last_modified.asString()) + const std::filesystem::file_time_type new_last_modified = std::filesystem::last_write_time(fsyspath(mFilename)); + if (mLastModified != new_last_modified) { if (loadMaterial()) { diff --git a/indra/newview/lllocalgltfmaterials.h b/indra/newview/lllocalgltfmaterials.h index b806b54508..bf9a8c68ae 100644 --- a/indra/newview/lllocalgltfmaterials.h +++ b/indra/newview/lllocalgltfmaterials.h @@ -30,6 +30,7 @@ #include "lleventtimer.h" #include "llpointer.h" #include "llgltfmateriallist.h" +#include <filesystem> class LLScrollListCtrl; class LLGLTFMaterial; @@ -73,7 +74,7 @@ private: /* members */ std::string mShortName; LLUUID mTrackingID; LLUUID mWorldID; - LLSD mLastModified; + std::filesystem::file_time_type mLastModified; EExtension mExtension; ELinkStatus mLinkStatus; S32 mUpdateRetries; diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 56e5555ba5..7a62f96064 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -194,7 +194,7 @@ private: boost::signals2::connection mLocationHistoryConnection; boost::signals2::connection mRegionCrossingSlot; LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot; - bool mIsNavMeshDirty; + bool mIsNavMeshDirty = false; LLUIImage* mLandmarkImageOn; LLUIImage* mLandmarkImageOff; LLPointer<LLUIImage> mIconMaturityGeneral; @@ -206,7 +206,7 @@ private: std::string mEditLandmarkTooltip; // this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location std::string mHumanReadableLocation; - bool isHumanReadableLocationVisible; + bool isHumanReadableLocationVisible = false; std::string mMaturityHelpTopic; }; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 1a07efe25d..8630438155 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -455,7 +455,7 @@ 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 in binary mode to prevent interpreting other characters as EOF - LLFILE* fptr = LLFile::fopen(log_file_name, "rb"); /*Flawfinder: ignore*/ + LLFILE* fptr = LLFile::fopen(log_file_name, LLFILE_MODE("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; @@ -892,7 +892,7 @@ bool LLLogChat::isAdHocTranscriptExist(std::string file_name) bool LLLogChat::isTranscriptFileFound(std::string fullname) { bool result = false; - LLFILE * filep = LLFile::fopen(fullname, "rb"); + LLFILE * filep = LLFile::fopen(fullname, LLFILE_MODE("rb")); if (NULL != filep) { if (makeLogFileName("chat") == fullname) @@ -1185,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), "rb");/*Flawfinder: ignore*/ + LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), LLFILE_MODE("rb"));/*Flawfinder: ignore*/ if (!fptr) { @@ -1194,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), "rb"); + fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), LLFILE_MODE("rb")); if (fptr) { fclose(fptr); LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name)); } - fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "rb"); + fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), LLFILE_MODE("rb")); } if (!fptr) { - fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "rb");/*Flawfinder: ignore*/ + fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), LLFILE_MODE("rb")); /*Flawfinder: ignore*/ if (!fptr) { mNewLoad = false; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 2f0a52e78b..05a9c3b28c 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -96,6 +96,8 @@ LLLoginInstance::LLLoginInstance() : mDispatcher.add("connect", "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1)); mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1)); mDispatcher.add("indeterminate", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); + // Todo, implement "authenticating"? + mDispatcher.add("authenticating", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1)); } void LLLoginInstance::setPlatformInfo(const std::string platform, diff --git a/indra/newview/lllookshistorypanel.h b/indra/newview/lllookshistorypanel.h deleted file mode 100644 index 6293de7170..0000000000 --- a/indra/newview/lllookshistorypanel.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file llpanelteleporthistory.h - * @brief Teleport history represented by a scrolling list - * class definition - * - * $LicenseInfo:firstyear=2009&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_LLPANELLOOKSHISTORY_H -#define LL_LLPANELLOOKSHISTORY_H - -#include "lluictrlfactory.h" -#include "llscrolllistctrl.h" - -#include "llpanelappearancetab.h" -#include "lllookshistory.h" - -class LLLooksHistoryPanel : public LLPanelAppearanceTab -{ -public: - LLLooksHistoryPanel(); - virtual ~LLLooksHistoryPanel(); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onSearchEdit(const std::string& string); - /*virtual*/ void onShowOnMap(); - /*virtual*/ void onLooks(); - ///*virtual*/ void onCopySLURL(); - - void showLooksHistory(); - void handleItemSelect(const LLSD& data); - - static void onDoubleClickItem(void* user_data); - -private: - enum LOOKS_HISTORY_COLUMN_ORDER - { - LIST_ICON, - LIST_ITEM_TITLE, - LIST_INDEX - }; - - LLLooksHistory* mLooksHistory; - LLScrollListCtrl* mHistoryItems; - std::string mFilterSubString; -}; - -#endif //LL_LLPANELLOOKSHISTORY_H diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index 0a90cf0699..0373b25143 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -34,7 +34,7 @@ #include <Wbemidl.h> #elif LL_DARWIN #include <CoreFoundation/CoreFoundation.h> -#include <IOKit/IOKitLib.h> +#include "llwindowmacosx_iokit.h" #endif unsigned char static_unique_id[] = {0,0,0,0,0,0}; unsigned char static_legacy_id[] = {0,0,0,0,0,0}; @@ -350,7 +350,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var bool getSerialNumber(unsigned char *unique_id, size_t len) { CFStringRef serial_cf_str = NULL; - io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, + io_service_t platformExpert = IOServiceGetMatchingService(kLLIOMainPort, IOServiceMatching("IOPlatformExpertDevice")); if (platformExpert) { diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index b63b8be095..4bf1b134ef 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -274,9 +274,6 @@ void LLManipRotate::render() } LLGLEnable cull_face(GL_CULL_FACE); -#if GL_VERSION_1_1 - LLGLEnable clip_plane0(GL_CLIP_PLANE0); -#endif LLGLDepthTest gls_depth(GL_FALSE); //LLGLDisable gls_stencil(GL_STENCIL_TEST); diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 66420d1cad..87b79fd18c 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -1309,6 +1309,12 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) LLVector3 grid_scale; LLQuaternion grid_rotation; LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale); + LLViewerCamera* camera = LLViewerCamera::getInstance(); + if (!camera) + { + // can be null on shutdown + return; + } bool uniform = LLManipScale::getUniform(); diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 30f634f6d4..dad04f4eab 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -450,17 +450,14 @@ LLMarketplaceInventoryImporter::LLMarketplaceInventoryImporter() , mImportInProgress(false) , mInitialized(false) , mMarketPlaceStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED) - , mErrorInitSignal(NULL) - , mStatusChangedSignal(NULL) - , mStatusReportSignal(NULL) { } boost::signals2::connection LLMarketplaceInventoryImporter::setInitializationErrorCallback(const status_report_signal_t::slot_type& cb) { - if (mErrorInitSignal == NULL) + if (mErrorInitSignal == nullptr) { - mErrorInitSignal = new status_report_signal_t(); + mErrorInitSignal = std::make_unique<status_report_signal_t>(); } return mErrorInitSignal->connect(cb); @@ -468,9 +465,9 @@ boost::signals2::connection LLMarketplaceInventoryImporter::setInitializationErr boost::signals2::connection LLMarketplaceInventoryImporter::setStatusChangedCallback(const status_changed_signal_t::slot_type& cb) { - if (mStatusChangedSignal == NULL) + if (mStatusChangedSignal == nullptr) { - mStatusChangedSignal = new status_changed_signal_t(); + mStatusChangedSignal = std::make_unique<status_changed_signal_t>(); } return mStatusChangedSignal->connect(cb); @@ -478,9 +475,9 @@ boost::signals2::connection LLMarketplaceInventoryImporter::setStatusChangedCall boost::signals2::connection LLMarketplaceInventoryImporter::setStatusReportCallback(const status_report_signal_t::slot_type& cb) { - if (mStatusReportSignal == NULL) + if (mStatusReportSignal == nullptr) { - mStatusReportSignal = new status_report_signal_t(); + mStatusReportSignal = std::make_unique<status_report_signal_t>(); } return mStatusReportSignal->connect(cb); @@ -717,8 +714,6 @@ LLMarketplaceTuple::LLMarketplaceTuple(const LLUUID& folder_id, S32 listing_id, LLMarketplaceData::LLMarketplaceData() : mMarketPlaceStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED), mMarketPlaceDataFetched(MarketplaceFetchCodes::MARKET_FETCH_NOT_DONE), - mStatusUpdatedSignal(NULL), - mDataFetchedSignal(NULL), mDirtyCount(false) { mInventoryObserver = new LLMarketplaceInventoryObserver; @@ -752,9 +747,9 @@ LLSD LLMarketplaceData::getMarketplaceStringSubstitutions() void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type& cb) { - if (mStatusUpdatedSignal == NULL) + if (mStatusUpdatedSignal == nullptr) { - mStatusUpdatedSignal = new status_updated_signal_t(); + mStatusUpdatedSignal = std::make_unique<status_updated_signal_t>(); } mStatusUpdatedSignal->connect(cb); @@ -842,7 +837,7 @@ void LLMarketplaceData::setDataFetchedSignal(const status_updated_signal_t::slot { if (mDataFetchedSignal == NULL) { - mDataFetchedSignal = new status_updated_signal_t(); + mDataFetchedSignal = std::make_unique<status_updated_signal_t>(); } mDataFetchedSignal->connect(cb); } diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h index 07ed667b0a..59c7dddc33 100644 --- a/indra/newview/llmarketplacefunctions.h +++ b/indra/newview/llmarketplacefunctions.h @@ -109,9 +109,9 @@ private: bool mInitialized; U32 mMarketPlaceStatus; - status_report_signal_t * mErrorInitSignal; - status_changed_signal_t * mStatusChangedSignal; - status_report_signal_t * mStatusReportSignal; + std::unique_ptr<status_report_signal_t> mErrorInitSignal; + std::unique_ptr<status_changed_signal_t> mStatusChangedSignal; + std::unique_ptr<status_report_signal_t> mStatusReportSignal; }; @@ -272,13 +272,13 @@ private: // Handling Marketplace connection and inventory connection U32 mMarketPlaceStatus; std::string mMarketPlaceFailureReason; - status_updated_signal_t* mStatusUpdatedSignal; + std::unique_ptr<status_updated_signal_t> mStatusUpdatedSignal; LLInventoryObserver* mInventoryObserver; bool mDirtyCount; // If true, stock count value need to be updated at the next check // Update data U32 mMarketPlaceDataFetched; - status_updated_signal_t* mDataFetchedSignal; + std::unique_ptr<status_updated_signal_t> mDataFetchedSignal; std::set<LLUUID> mPendingUpdateSet; // Listing folders waiting for validation diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index 4e14f416e9..323ea9f552 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -177,6 +177,65 @@ void LLFloaterComboOptions::onCancel() closeFloater(); } +class LLMaterialEditorTaskMoveObserver : public LLInventoryAddItemByAssetObserver +{ +public: + LLMaterialEditorTaskMoveObserver( + const LLUUID& asset_id, + const LLUUID& dest_folder_id, + LLPointer<LLInventoryCallback> cb) + : mDestFolderID(dest_folder_id), + mCallback(cb) + { + watchAsset(asset_id); + } + + virtual ~LLMaterialEditorTaskMoveObserver() + { + gInventory.removeObserver(this); + } + + virtual void changed(U32 mask) override + { + // Call base class to populate mAddedItems + LLInventoryAddItemByAssetObserver::changed(mask); + + // If base class completed (which calls done() and clears mAddedItems), + // and we set mIsDirty, that means we're finished + if (mIsDirty) + { + gInventory.removeObserver(this); + delete this; + } + } + +protected: + virtual void done() override + { + // Find the moved item + // There must be only one since we are watching only one item, + // changed wouldn't fire otherwise. But just in case. + if (mAddedItems.size() == 1) + { + LLUUID item_id = mAddedItems[0]; + + // Fire the callback + if (mCallback) + { + mCallback->fire(item_id); + } + } + + // Todo: gInventoryMoveObserver normally opens inventory + // on completion, should this do the same? + } + +private: + LLUUID mDestFolderID; + std::string mNewName; + LLPointer<LLInventoryCallback> mCallback; +}; + class LLMaterialEditorCopiedCallback : public LLInventoryCallback { public: @@ -190,6 +249,18 @@ public: {} LLMaterialEditorCopiedCallback( + const std::string & buffer, + const LLSD & old_key, + const std::string & new_name, + bool has_unsaved_changes) + : mBuffer(buffer), + mOldKey(old_key), + mNewName(new_name), + mHasUnsavedChanges(has_unsaved_changes) + { + } + + LLMaterialEditorCopiedCallback( const LLSD &old_key, const std::string &new_name) : mOldKey(old_key), @@ -201,7 +272,10 @@ public: { if (!mNewName.empty()) { - // making a copy from a notecard doesn't change name, do it now + // making a copy from a task inventory (object, notecard) + // doesn't change name, do it now + // Todo: Can calling update_inventory_item and finishSaveAs + // cause a race condition? LLViewerInventoryItem* item = gInventory.getItem(inv_item_id); if (item->getName() != mNewName) { @@ -1811,6 +1885,52 @@ void LLMaterialEditor::onSaveAsMsgCallback(const LLSD& notification, const LLSD& mNotecardInventoryID, mAuxItem.get(), gInventoryCallbacks.registerCB(cb)); + + mAssetStatus = PREVIEW_ASSET_LOADING; + setEnabled(false); + } + else if (mObjectUUID.notNull()) + { + // Item is in task (object) inventory - must move to agent + // inventory first. + // Note: If this is too flimsy, just disable the 'save as' + // button when in object inventory and create a server ticket, + // as we need a copy with callback variant. + LLViewerObject* object = gObjectList.findObject(mObjectUUID); + if (object) + { + LLPermissions perm(item->getPermissions()); + if (perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID())) + { + // Create a callback for after the item is copied/moved + std::string buffer = getEncodedAsset(); + LLPointer<LLInventoryCallback> cb = new LLMaterialEditorCopiedCallback( + buffer, + getKey(), + new_name, + mUnsavedChanges); + + // Create observer to watch for the item arriving in inventory + // The observer will fire our callback when the move completes + LLMaterialEditorTaskMoveObserver* observer = new LLMaterialEditorTaskMoveObserver( + item->getAssetUUID(), + parent_id, + cb + ); + gInventory.addObserver(observer); + + // Copies(not moves) item from object to agent inventory + object->moveInventory(parent_id, item->getUUID()); + + mAssetStatus = PREVIEW_ASSET_LOADING; + setEnabled(false); + } + else + { + LL_WARNS("MaterialEditor") << "Insufficient permissions to copy material from object inventory" << LL_ENDL; + } + } } else { @@ -1823,10 +1943,10 @@ void LLMaterialEditor::onSaveAsMsgCallback(const LLSD& notification, const LLSD& parent_id, new_name, cb); - } - mAssetStatus = PREVIEW_ASSET_LOADING; - setEnabled(false); + mAssetStatus = PREVIEW_ASSET_LOADING; + setEnabled(false); + } } else { diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index 723f834d6f..4dc3f958aa 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -234,7 +234,7 @@ boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LL get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id); if (itCallback == mGetCallbacks.end()) { - std::pair<get_callback_map_t::iterator, bool> ret = mGetCallbacks.insert(std::pair<LLMaterialID, get_callback_t*>(material_id, new get_callback_t())); + std::pair<get_callback_map_t::iterator, bool> ret = mGetCallbacks.emplace(material_id, std::make_unique<get_callback_t>()); itCallback = ret.first; } connection = itCallback->second->connect(cb);; @@ -279,7 +279,7 @@ boost::signals2::connection LLMaterialMgr::getTE(const LLUUID& region_id, const get_callback_te_map_t::iterator itCallback = mGetTECallbacks.find(te_mat_pair); if (itCallback == mGetTECallbacks.end()) { - std::pair<get_callback_te_map_t::iterator, bool> ret = mGetTECallbacks.insert(std::pair<TEMaterialPair, get_callback_te_t*>(te_mat_pair, new get_callback_te_t())); + std::pair<get_callback_te_map_t::iterator, bool> ret = mGetTECallbacks.emplace(te_mat_pair, std::make_unique<get_callback_te_t>()); itCallback = ret.first; } connection = itCallback->second->connect(cb); @@ -317,7 +317,7 @@ boost::signals2::connection LLMaterialMgr::getAll(const LLUUID& region_id, LLMat getall_callback_map_t::iterator itCallback = mGetAllCallbacks.find(region_id); if (mGetAllCallbacks.end() == itCallback) { - std::pair<getall_callback_map_t::iterator, bool> ret = mGetAllCallbacks.insert(std::pair<LLUUID, getall_callback_t*>(region_id, new getall_callback_t())); + std::pair<getall_callback_map_t::iterator, bool> ret = mGetAllCallbacks.emplace(region_id, std::make_unique<getall_callback_t>()); itCallback = ret.first; } return itCallback->second->connect(cb);; @@ -329,8 +329,8 @@ void LLMaterialMgr::put(const LLUUID& object_id, const U8 te, const LLMaterial& if (mPutQueue.end() == itQueue) { LL_DEBUGS("Materials") << "mPutQueue insert object " << object_id << LL_ENDL; - mPutQueue.insert(std::pair<LLUUID, facematerial_map_t>(object_id, facematerial_map_t())); - itQueue = mPutQueue.find(object_id); + auto ret = mPutQueue.emplace(object_id, facematerial_map_t()); + itQueue = ret.first; } facematerial_map_t::iterator itFace = itQueue->second.find(te); @@ -361,7 +361,7 @@ void LLMaterialMgr::setLocalMaterial(const LLUUID& region_id, LLMaterialPtr mate } LL_DEBUGS("Materials") << "region " << region_id << "new local material id " << material_id << LL_ENDL; - mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(material_id, material_ptr)); + mMaterials.emplace(material_id, material_ptr); setMaterialCallbacks(material_id, material_ptr); @@ -376,7 +376,7 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL { LL_DEBUGS("Materials") << "new material" << LL_ENDL; LLMaterialPtr newMaterial(new LLMaterial(material_data)); - std::pair<material_map_t::const_iterator, bool> ret = mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(material_id, newMaterial)); + std::pair<material_map_t::const_iterator, bool> ret = mMaterials.emplace(material_id, newMaterial); itMaterial = ret.first; } @@ -400,7 +400,6 @@ void LLMaterialMgr::setMaterialCallbacks(const LLMaterialID& material_id, const if (itCallbackTE != mGetTECallbacks.end()) { (*itCallbackTE->second)(material_id, material_ptr, te_mat_pair.te); - delete itCallbackTE->second; mGetTECallbacks.erase(itCallbackTE); } } @@ -410,7 +409,6 @@ void LLMaterialMgr::setMaterialCallbacks(const LLMaterialID& material_id, const { (*itCallback->second)(material_id, material_ptr); - delete itCallback->second; mGetCallbacks.erase(itCallback); } } @@ -509,7 +507,6 @@ void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LL { (*itCallback->second)(region_id, materials); - delete itCallback->second; mGetAllCallbacks.erase(itCallback); } @@ -549,11 +546,11 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content) { llassert(response_data.isArray()); LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL; +#ifdef SHOW_ASSERT // same condition that controls llassert() for (LLSD::array_const_iterator faceIter = response_data.beginArray(); faceIter != response_data.endArray(); ++faceIter) { -# ifdef SHOW_ASSERT // same condition that controls llassert() const LLSD& face_data = *faceIter; // conditional to avoid unused variable warning -# endif + llassert(face_data.isMap()); llassert(face_data.has(MATERIALS_CAP_OBJECT_ID_FIELD)); @@ -570,6 +567,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content) // *TODO: do we really still need to process this? } +#endif } } diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index c04f874923..5fc0b1b290 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -120,13 +120,13 @@ private: typedef std::map<LLUUID, material_queue_t> get_queue_t; typedef std::pair<const LLUUID, LLMaterialID> pending_material_t; typedef std::map<const pending_material_t, F64> get_pending_map_t; - typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t; + typedef std::map<LLMaterialID, std::unique_ptr<get_callback_t>> get_callback_map_t; - typedef std::unordered_map<TEMaterialPair, get_callback_te_t*> get_callback_te_map_t; + typedef std::unordered_map<TEMaterialPair, std::unique_ptr<get_callback_te_t>> get_callback_te_map_t; typedef std::set<LLUUID> getall_queue_t; typedef std::map<LLUUID, F64> getall_pending_map_t; - typedef std::map<LLUUID, getall_callback_t*> getall_callback_map_t; + typedef std::map<LLUUID, std::unique_ptr<getall_callback_t>> getall_callback_map_t; typedef std::map<U8, LLMaterial> facematerial_map_t; typedef std::map<LLUUID, facematerial_map_t> put_queue_t; diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 4a808ba052..9b61529b5d 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -62,9 +62,15 @@ #include "lllineeditor.h" #include "llfloaterwebcontent.h" #include "llwindowshade.h" +#include "lleventapi.h" +#include "llui.h" extern bool gRestoreGL; +const std::string PAGE_TEXT_EXTRACT_MARKER = "PAGE_TEXT_EXTRACT:"; + +class LLMediaCtrlListener; + static LLDefaultChildRegistry::Register<LLMediaCtrl> r("web_browser"); LLMediaCtrl::Params::Params() @@ -100,6 +106,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mUpdateScrolls( false ), mTextureWidth ( 1024 ), mTextureHeight ( 1024 ), + mLoadingState( LOADING_STATE_INITIALIZING ), mClearCache(false), mHomePageMimeType(p.initial_mime_type), mErrorPageURL(p.error_page_url), @@ -1024,16 +1031,14 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL; hideNotification(); + mLoadingState = LOADING_STATE_LOADING; }; break; case MEDIA_EVENT_NAVIGATE_COMPLETE: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL; - if(mHidingInitialLoad) - { - mHidingInitialLoad = false; - } + mLoadingState = LOADING_STATE_LOADED; }; break; @@ -1062,6 +1067,7 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) { navigateTo(mErrorPageURL, HTTP_CONTENT_TEXT_HTML); }; + mLoadingState = LOADING_STATE_ERROR; }; break; @@ -1106,12 +1112,14 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_PLUGIN_FAILED: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << LL_ENDL; + mLoadingState = LOADING_STATE_ERROR; }; break; case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << LL_ENDL; + mLoadingState = LOADING_STATE_ERROR; }; break; @@ -1194,6 +1202,33 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_DEBUG_MESSAGE: { LL_INFOS("media") << self->getDebugMessageText() << LL_ENDL; + + // Handle text extraction responses + std::string debug_text = self->getDebugMessageText(); + if (debug_text.find(PAGE_TEXT_EXTRACT_MARKER) != std::string::npos) + { + if (LLPluginClassMedia* plugin = getMediaPlugin()) + { + // Disable plugin debugging if it was used just for text extraction + static LLCachedControl<bool> media_debugging(gSavedSettings, "MediaPluginDebugging", false); + plugin->enableMediaPluginDebugging(media_debugging); + } + // Extract the pump name and page text + size_t marker_pos = debug_text.find(PAGE_TEXT_EXTRACT_MARKER); + if (marker_pos != std::string::npos) + { + std::string remaining = debug_text.substr(marker_pos + PAGE_TEXT_EXTRACT_MARKER.length()); + size_t colon_pos = remaining.find(':'); + if (colon_pos != std::string::npos) + { + std::string pump_name = remaining.substr(0, colon_pos); + std::string page_text = remaining.substr(colon_pos + 1); + + // Send the response directly to the specified pump + LLEventPumps::instance().obtain(pump_name).post(LLSD().with("text", page_text)); + } + } + } }; break; }; @@ -1274,3 +1309,182 @@ bool LLMediaCtrl::wantsReturnKey() const { return true; } + +std::string LLMediaCtrl::getMediaMimeType() +{ + return mMediaSource ? mMediaSource->getMimeType() : "unknown"; +} + +std::string LLMediaCtrl::getMediaLoadingStatus() +{ + if (!mMediaSource) + { + return "error"; + } + + switch (mLoadingState) + { + case LOADING_STATE_INITIALIZING: + return "initializing"; + case LOADING_STATE_LOADING: + return "loading"; + case LOADING_STATE_LOADED: + return "loaded"; + case LOADING_STATE_ERROR: + default: + return "error"; + } +} + +std::string LLMediaCtrl::getMediaTitle() +{ + if (mMediaSource) + { + if (LLPluginClassMedia* plugin = mMediaSource->getMediaPlugin()) + { + return plugin->getMediaName(); + } + } + return "unknown"; +} + +bool LLMediaCtrl::executeJavaScript(const std::string& script) +{ + if (mMediaSource && mMediaSource->hasMedia()) + { + mMediaSource->executeJavaScript(script); + return true; + } + return false; +} + +class LLMediaCtrlListener: public LLEventAPI +{ +public: + LLMediaCtrlListener(); + +private: + void getMediaInfo(const LLSD& request); + void getMediaText(const LLSD& request); + void getPluginsList(const LLSD& request); + void replyError(const LLSD& request, const std::string& error); + LLMediaCtrl* findMediaCtrl(const std::string& path); +}; + +LLMediaCtrlListener::LLMediaCtrlListener(): + LLEventAPI("LLMediaAPI", "Acces to LLMediaCtrl(web_browse widget) info") +{ + add("getMediaInfo", + "Get information about the web_browser widget specified by [\"path\"].\n" + "Returns URL, MIME type, and loading status of the widget.", + &LLMediaCtrlListener::getMediaInfo, + llsd::map("path", LLSD(), "reply", LLSD())); + + add("getMediaText", + "Get text content from the web_browser widget specified by [\"path\"].\n" + "Returns the text content of the page or a portion of it.", + &LLMediaCtrlListener::getMediaText, + llsd::map("path", LLSD(), "reply", LLSD())); + + add("getPluginsList", + "Enumerate the active media plugin (SLPlugin) instances.\n" + "Reply contains [\"plugins\"] an array of { pid, url, mime_type, remote_debugging_port } entries.", + &LLMediaCtrlListener::getPluginsList, + llsd::map("reply", LLSD())); +} + +LLMediaCtrl* LLMediaCtrlListener::findMediaCtrl(const std::string& path) +{ + LLView* view = LLUI::getInstance()->resolvePath(LLUI::getInstance()->getRootView(), path); + if (!view) + { + return nullptr; + } + return dynamic_cast<LLMediaCtrl*>(view); +} + +void LLMediaCtrlListener::getMediaInfo(const LLSD& request) +{ + Response reply(LLSD(), request); + std::string path = request["path"]; + + LLMediaCtrl* media_ctrl = findMediaCtrl(path); + if (!media_ctrl) + { + reply["error"] = "Could not find web_browser widget at path: " + path; + return; + } + + reply["url"] = media_ctrl->getCurrentNavUrl(); + reply["mime_type"] = media_ctrl->getMediaMimeType(); + reply["status"] = media_ctrl->getMediaLoadingStatus(); + reply["title"] = media_ctrl->getMediaTitle(); +} + +void LLMediaCtrlListener::replyError(const LLSD& request, const std::string& error) +{ + Response reply(LLSD(), request); + reply["error"] = error; +} + +void LLMediaCtrlListener::getMediaText(const LLSD& request) +{ + std::string path = request["path"]; + + LLMediaCtrl* media_ctrl = findMediaCtrl(path); + if (!media_ctrl) + { + replyError(request, "Could not find web_browser widget at path: " + path); + return; + } + + LLPluginClassMedia* plugin = media_ctrl->getMediaPlugin(); + if (!plugin) + { + replyError(request, "Media plugin is not available for widget at path: " + path); + return; + } + + // Enable plugin debugging to capture console messages + plugin->enableMediaPluginDebugging(true); + std::string pump_name = request["reply"].asString(); + + // Execute JavaScript to extract page text, embedding pump name in the marker + const std::string text_extract_script = "console.log('" + PAGE_TEXT_EXTRACT_MARKER + pump_name + ":' + " + "(document.body ? (document.body.innerText ? document.body.innerText.substring(0, 1000).replace(/\\s+/g, ' ').trim() : " + "'No text content') : 'Document body not ready'));"; + + if (!media_ctrl->executeJavaScript(text_extract_script)) + { + replyError(request, "Failed to execute JavaScript for text extraction"); + } +} + +void LLMediaCtrlListener::getPluginsList(const LLSD& request) +{ + Response reply(LLSD(), request); + + LLSD plugins; + + LLViewerMedia::impl_list& impls = LLViewerMedia::getInstance()->getPriorityList(); + for (LLViewerMedia::impl_list::iterator it = impls.begin(); it != impls.end(); ++it) + { + LLViewerMediaImpl* impl = *it; + if (!impl) + { + continue; + } + LLPluginClassMedia* plugin = impl->getMediaPlugin(); + + LLSD entry; + entry["url"] = impl->getCurrentMediaURL(); + entry["mime_type"] = impl->getMimeType(); + entry["pid"] = plugin ? plugin->getProcessID() : 0; + entry["remote_debugging_port"] = plugin ? (S32)plugin->getCefRemoteDebuggingPort() : 0; + + plugins.append(entry); + } + reply["plugins"] = plugins; +} + +static LLMediaCtrlListener sMediaCtrlListener; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index a644ef3071..0a092f21d2 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -77,6 +77,14 @@ protected: public: virtual ~LLMediaCtrl(); + enum ELoadingState + { + LOADING_STATE_INITIALIZING = 0, + LOADING_STATE_LOADING = 1, + LOADING_STATE_LOADED = 2, + LOADING_STATE_ERROR = 3 + }; + void setBorderVisible( bool border_visible ); // For the tutorial window, we don't want to take focus on clicks, @@ -181,6 +189,11 @@ public: virtual bool acceptsTextInput() const { return true; } + std::string getMediaMimeType(); + std::string getMediaLoadingStatus(); + std::string getMediaTitle(); + bool executeJavaScript(const std::string& script); + protected: void convertInputCoords(S32& x, S32& y); @@ -202,7 +215,6 @@ public: mStretchToFill, mMaintainAspectRatio, mHideLoading, - mHidingInitialLoad, mClearCache, mHoverTextChanged, mDecoupleTextureSize, @@ -217,6 +229,7 @@ public: viewer_media_t mMediaSource; S32 mTextureWidth, mTextureHeight; + ELoadingState mLoadingState; class LLWindowShade* mWindowShade; LLHandle<LLContextMenu> mContextMenuHandle; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index fb6ecedcbf..2b8ecbb667 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4277,15 +4277,17 @@ void LLMeshRepository::shutdown() delete mMeshMutex; mMeshMutex = NULL; - LL_INFOS(LOG_MESH) << "Shutting down decomposition system." << LL_ENDL; - if (mDecompThread) { mDecompThread->shutdown(); delete mDecompThread; mDecompThread = NULL; } +} +void LLMeshRepository::shutdownDecomposition() +{ + LL_INFOS(LOG_MESH) << "Shutting down decomposition system." << LL_ENDL; LLConvexDecomposition::quitSystem(); } @@ -4580,7 +4582,7 @@ void LLMeshRepository::notifyLoadedMeshes() // erase from background thread mThread->mWorkQueue.post([=, this]() { - LLMutexLock(mThread->mSkinMapMutex); + LLMutexLock skin_lock(mThread->mSkinMapMutex); mThread->mSkinMap.erase(id); }); } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 061b4b5428..28b7a2d01f 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -864,6 +864,7 @@ public: void init(); void unregisterAllMeshes(); void shutdown(); + void shutdownDecomposition(); S32 update(); void unregisterMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail); @@ -976,4 +977,3 @@ const F32 ANIMATED_OBJECT_BASE_COST = 15.0f; const F32 ANIMATED_OBJECT_COST_PER_KTRI = 1.5f; #endif - diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index d3f28b3c18..d97525d494 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -3597,7 +3597,7 @@ bool LLModelPreview::render() gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); if (show_edges) { - glLineWidth(PREVIEW_EDGE_WIDTH); + gGL.setLineWidth(PREVIEW_EDGE_WIDTH); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -3605,7 +3605,7 @@ bool LLModelPreview::render() #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif - glLineWidth(1.f); + gGL.setLineWidth(1.f); } buffer->unmapBuffer(); } @@ -3653,7 +3653,7 @@ bool LLModelPreview::render() LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; if (decomp) { - LLMutexLock(decomp->mMutex); + LLMutexLock decomp_lock(decomp->mMutex); LLModel::Decomposition& physics = model->mPhysics; @@ -3728,6 +3728,7 @@ bool LLModelPreview::render() buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0); gGL.diffuseColor4fv(PREVIEW_PSYH_EDGE_COL.mV); + gGL.setLineWidth(PREVIEW_PSYH_EDGE_WIDTH); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -3736,6 +3737,7 @@ bool LLModelPreview::render() #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif + gGL.setLineWidth(1.f); buffer->unmapBuffer(); } @@ -3747,6 +3749,7 @@ bool LLModelPreview::render() // only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks] if (mHasDegenerate) { + gGL.setLineWidth(PREVIEW_DEG_EDGE_WIDTH); #if GL_VERSION_1_1 glPointSize(PREVIEW_DEG_POINT_SIZE); #endif @@ -3777,7 +3780,7 @@ bool LLModelPreview::render() LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; if (decomp) { - LLMutexLock(decomp->mMutex); + LLMutexLock decomp_lock(decomp->mMutex); LLModel::Decomposition& physics = model->mPhysics; @@ -3818,7 +3821,7 @@ bool LLModelPreview::render() gGL.popMatrix(); } - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); #if GL_VERSION_1_1 glPointSize(1.f); #endif @@ -3942,7 +3945,7 @@ bool LLModelPreview::render() { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); - //glLineWidth(PREVIEW_EDGE_WIDTH); + //gGL.setLineWidth(PREVIEW_EDGE_WIDTH); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -3950,6 +3953,7 @@ bool LLModelPreview::render() #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif + gGL.setLineWidth(1.f); } } } diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index b72301c566..880e675c6b 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -167,7 +167,8 @@ LLMuteList::LLMuteList() : mLoadState(ML_INITIAL), mLoadSource(MLS_NONE), mRequestStartTime(0.f), - mTriedCacheFallback(false) + mTriedCacheFallback(false), + mTriedRegionChangeRetry(false) { gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList); @@ -683,7 +684,7 @@ bool LLMuteList::loadFromFile(const std::string& filename, EMuteListSource sourc return false; } - LLFILE* fp = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("rb")); /*Flawfinder: ignore*/ if (!fp) { LL_WARNS() << "Couldn't open mute list " << filename << LL_ENDL; @@ -750,7 +751,7 @@ bool LLMuteList::saveToFile(const std::string& filename) return false; } - LLFILE* fp = LLFile::fopen(filename, "wb"); /*Flawfinder: ignore*/ + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("wb")); /*Flawfinder: ignore*/ if (!fp) { LL_WARNS() << "Couldn't open mute list " << filename << LL_ENDL; @@ -857,6 +858,9 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id) // Guard against potentially writing back to disk since we're not recovering our connection mLoadState = ML_LOADED; mLoadSource = MLS_FALLBACK_CACHE; + // This code path means we have disconnected/crashed before our request has been sent. + // As a result we do not NEED to do anything more than set these state values. + // cache() is liable to be called on shutdown, but since we've set a dirty state it will avoid writing to disk. return; } if (!gAgent.getRegion()) @@ -879,7 +883,7 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id) void LLMuteList::cache(const LLUUID& agent_id) { // Write to disk even if empty, but never from degraded fallback state. - if (isLoaded() && mLoadSource != MLS_FALLBACK_CACHE) + if (isLoaded() && !isLoadedDegraded()) { const std::string filename = getCacheFilename(agent_id); saveToFile(filename); @@ -1080,7 +1084,7 @@ LLRenderMuteList::LLRenderMuteList() bool LLRenderMuteList::saveToFile() { std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.txt"); - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("wb")); if (!fp) { LL_WARNS() << "Couldn't open render mute list file: " << filename << LL_ENDL; @@ -1105,7 +1109,7 @@ bool LLRenderMuteList::loadFromFile() LL_PROFILE_ZONE_SCOPED; std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.txt"); - LLFILE* fp = LLFile::fopen(filename, "rb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("rb")); if (!fp) { LL_WARNS() << "Couldn't open render mute list file: " << filename << LL_ENDL; diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 2781e9b177..aff23c72d1 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -129,9 +129,9 @@ public: // Load state accessors. bool isLoaded() const { return mLoadState == ML_LOADED; } // Loaded, but not necessarily from server. bool isFailed() const { return mLoadState == ML_FAILED; } // Unable to load any mute list. Server did not reply. - // Loaded from server, which is the only source we consider authoritative. - bool isLoadedFromServer() const { return isLoaded() && (mLoadSource == MLS_SERVER || mLoadSource == MLS_SERVER_EMPTY); } - // Loaded, but from cache. Would be nice to upgrade to a server load from here if possible. + // Loaded from an authoritative server response, including when the server directs us to use our cached copy. + bool isLoadedFromServer() const { return isLoaded() && (mLoadSource == MLS_SERVER || mLoadSource == MLS_SERVER_EMPTY || mLoadSource == MLS_SERVER_CACHE); } + // Loaded without an authoritative server response. Would be nice to upgrade to a server load from here if possible. bool isLoadedDegraded() const { return isLoaded() && !isLoadedFromServer(); } // Advance the load state machine, trying cache fallback if necessary. diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 2bb6af24bc..2bb6af24bc 100755..100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp index 5cec35fc88..3fb922f93f 100644 --- a/indra/newview/llnotificationstorage.cpp +++ b/indra/newview/llnotificationstorage.cpp @@ -108,7 +108,10 @@ bool LLNotificationStorage::readNotifications(LLSD& pNotificationData, bool is_n { std::string filename = is_new_filename? mFileName : mOldFileName; - LL_INFOS("LLNotificationStorage") << "starting read '" << filename << "'" << LL_ENDL; + if (!filename.empty()) + { + LL_INFOS("LLNotificationStorage") << "starting read '" << filename << "'" << LL_ENDL; + } bool didFileRead; @@ -118,7 +121,17 @@ bool LLNotificationStorage::readNotifications(LLSD& pNotificationData, bool is_n didFileRead = notifyFile.is_open(); if (!didFileRead) { - LL_WARNS("LLNotificationStorage") << "Failed to open file '" << filename << "'" << LL_ENDL; + if (!filename.empty()) + { + if (LLFile::isfile(filename)) + { + LL_WARNS("LLNotificationStorage") << "Failed to open file '" << filename << "'" << LL_ENDL; + } + else + { + LL_INFOS("LLNotificationStorage") << "File '" << filename << "' doesn't exist" << LL_ENDL; + } + } } else { @@ -144,7 +157,10 @@ bool LLNotificationStorage::readNotifications(LLSD& pNotificationData, bool is_n if(didFileRead) { writeNotifications(pNotificationData); - LLFile::remove(mOldFileName); + if (!mOldFileName.empty()) + { + LLFile::remove(mOldFileName, ENOENT); + } } } } diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 852f2dab21..9b21a217db 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -1005,6 +1005,8 @@ LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p) mSelected(false), mWorn(false), mDefaultImage(true), + mHidden(false), + mFavorite(false), mOutfitName(""), mUUID(LLUUID()) { diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h index ebf0ba1a12..431f37f78c 100644 --- a/indra/newview/lloutfitobserver.h +++ b/indra/newview/lloutfitobserver.h @@ -75,7 +75,7 @@ protected: S32 mBaseOutfitLastVersion; std::string mLastBaseOutfitName; - bool mLastOutfitDirtiness; + bool mLastOutfitDirtiness = false; LLUUID mItemNameHash; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 7db79c7010..d49d1d662a 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -519,6 +519,22 @@ void LLOutfitsList::resetItemSelection(LLWearableItemsList* list, const LLUUID& list->resetSelection(); mItemSelected = false; signalSelectionOutfitUUID(category_id); + + // If filtering was applied while tab was collapsed, item visibility is updated but the parent tab height might not be updated. + // Force rearrange to recompute the height, when tab is expanded. + static LLCachedControl<bool> show_all_items(gSavedSettings, "OutfitListFilterFullList", 1); + if (!show_all_items) + { + outfits_map_t::const_iterator tab_iter = mOutfitsMap.find(category_id); + if (tab_iter != mOutfitsMap.end()) + { + LLOutfitAccordionCtrlTab* tab = tab_iter->second; + if (tab && tab->getDisplayChildren()) + { + list->notify(LLSD().with("rearrange", true)); + } + } + } } void LLOutfitsList::onChangeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) @@ -664,6 +680,8 @@ void LLOutfitsList::applyFilterToTab( } else { + // We got a match + tab->setVisible(true); // Try restoring the tab selection. restoreOutfitSelection(tab, category_id); } @@ -1648,7 +1666,7 @@ bool LLOutfitListSortMenu::onEnable(LLSD::String param) } else if ("show_entire_outfit" == param) { - static LLCachedControl<bool> filter_mode(gSavedSettings, "OutfitListFilterFullList", 0); + static LLCachedControl<bool> filter_mode(gSavedSettings, "OutfitListFilterFullList", 1); return filter_mode; } diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 7910bcb41d..c0b96ced2f 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -31,6 +31,7 @@ // linden library includes #include "llerror.h" +#include "llcombobox.h" #include "llfiltereditor.h" #include "llfloaterreg.h" #include "llfontgl.h" @@ -55,11 +56,13 @@ #include "lltrans.h" #include "llviewerassettype.h" #include "llviewerinventory.h" +#include "llviewercontrol.h" #include "llviewerobject.h" #include "llviewerregion.h" #include "llviewerwindow.h" #include "llworld.h" #include "llfloaterperms.h" +#include "llviewerassetupload.h" // // Imported globals @@ -81,9 +84,13 @@ bool LLPanelContents::postBuild() { setMouseOpaque(false); - childSetAction("button new script",&LLPanelContents::onClickNewScript, this); + getChild<LLUICtrl>("button new script")->setCommitCallback(boost::bind(&LLPanelContents::onNewScriptFlyoutCommit, this, _1)); + childSetAction("button new notecard", boost::bind(&LLPanelContents::onNewNotecardCommit, this)); childSetAction("button permissions",&LLPanelContents::onClickPermissions, this); + mPublishButton = getChild<LLButton>("button publish"); + mPublishButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { onClickPublish(); }); + mFilterEditor = getChild<LLFilterEditor>("contents_filter"); mFilterEditor->setCommitCallback([&](LLUICtrl*, const LLSD&) { onFilterEdit(); }); @@ -113,6 +120,9 @@ void LLPanelContents::getState(LLViewerObject *objectp ) if( !objectp ) { getChildView("button new script")->setEnabled(false); + getChildView("button new notecard")->setEnabled(false); + mPublishButton->setEnabled(false); + mPublishButton->setToggleState(false); return; } @@ -125,15 +135,48 @@ void LLPanelContents::getState(LLViewerObject *objectp ) && ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488 bool all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); + S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + S32 root_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + bool single_root = (root_count == 1); + + bool new_button_enabled = editable && all_volume && (single_root || (object_count == 1)); + // Edit script button - ok if object is editable and there's an unambiguous destination for the object. - getChildView("button new script")->setEnabled( - editable && - all_volume && - ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1) - || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))); + getChildView("button new script")->setEnabled(new_button_enabled); + + // Enable the Lua script option only when the region supports it. + bool lua_region = false; + LLViewerRegion* region = objectp->getRegion(); + if (region && region->simulatorFeaturesReceived()) + { + LLSD simulatorFeatures; + region->getSimulatorFeatures(simulatorFeatures); + lua_region = simulatorFeatures["LuaScriptsEnabled"].asBoolean(); + } + getChild<LLComboBox>("button new script")->setEnabledByValue("lua", lua_region); getChildView("button permissions")->setEnabled(!objectp->isPermanentEnforced()); mPanelInventoryObject->setEnabled(!objectp->isPermanentEnforced()); + + + + // New Notecard button - requires the CreateTaskInventoryItem cap. + bool has_create_cap = region && !region->getCapability("CreateTaskInventoryItem").empty(); + getChildView("button new notecard")->setEnabled(has_create_cap && new_button_enabled); + + // Publish button - enabled only when WS server is configured, and a single editable root object is selected. + mPublishButton->setEnabled(LLScriptEditorWSServer::isEnabled() && new_button_enabled); + + // Sync toggle state to reflect whether the object is currently published. + if (LLScriptEditorWSServer::isEnabled()) + { + auto server = LLScriptEditorWSServer::getServer(); + mPublishButton->setToggleState(server && server->isObjectPublished(objectp->getID())); + } + else + { + mPublishButton->setToggleState(false); + } } void LLPanelContents::onFilterEdit() @@ -220,49 +263,118 @@ void LLPanelContents::clearContents() // Static functions // -// static -void LLPanelContents::onClickNewScript(void *userdata) +void LLPanelContents::onNewScriptFlyoutCommit(LLUICtrl* ctrl) { const bool children_ok = true; LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); - if(object) + if (!object) return; + + U8 script_language; + const std::string value = ctrl->getValue().asString(); + if (value == "lsl") { - LLPermissions perm; - perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); + script_language = SST_LSL; + } + else if (value == "lua") + { + script_language = SST_LUA; + } + else + { + script_language = SST_LSL; + LLViewerRegion* region = object->getRegion(); + if (region && region->simulatorFeaturesReceived()) + { + LLSD simulatorFeatures; + region->getSimulatorFeatures(simulatorFeatures); + if (simulatorFeatures["LuaScriptsEnabled"].asBoolean()) + { + script_language = SST_LUA; + } + } + } + + std::string vm = (script_language == SST_LUA) ? "luau" : "mono"; + + LLSD params; + params["enabled"] = true; + params["vm"] = vm; + + createTaskInventoryItemHelper(object, + LLAssetType::AT_LSL_TEXT, + LLInventoryType::IT_LSL, + script_language, + "New Script", + params); +} + +void LLPanelContents::createTaskInventoryItemHelper( + LLViewerObject* object, + LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U8 sub_type, + const std::string& name, + const LLSD& params) +{ + const char* perm_key = (asset_type == LLAssetType::AT_LSL_TEXT) ? "Scripts" : "Notecards"; + + LLPermissions perm; + perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); + perm.initMasks( + PERM_ALL, + PERM_ALL, + LLFloaterPerms::getEveryonePerms(perm_key), + LLFloaterPerms::getGroupPerms(perm_key), + PERM_MOVE | LLFloaterPerms::getNextOwnerPerms(perm_key)); + + std::string desc; + LLViewerAssetType::generateDescriptionFor(asset_type, desc); - // Parameters are base, owner, everyone, group, next - perm.initMasks( - PERM_ALL, - PERM_ALL, - LLFloaterPerms::getEveryonePerms("Scripts"), - LLFloaterPerms::getGroupPerms("Scripts"), - PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Scripts")); - std::string desc; - LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); + // Use cap if available, fall back to saveScript for scripts + if (!object->getRegion()->getCapability("CreateTaskInventoryItem").empty()) + { + object->createInventoryItem(asset_type, inventory_type, sub_type, + name, desc, perm, params, + [](bool success, const LLSD& response) + { + if (!success) + { + LL_WARNS() << "CreateTaskInventoryItem failed: " + << response["message"].asString() << LL_ENDL; + } + }); + } + else if (asset_type == LLAssetType::AT_LSL_TEXT) + { + // Fallback: use legacy RezScript UDP LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem( - LLUUID::null, - LLUUID::null, - perm, - LLUUID::null, - LLAssetType::AT_LSL_TEXT, - LLInventoryType::IT_LSL, - "New Script", - desc, - LLSaleInfo::DEFAULT, - LLInventoryItemFlags::II_FLAGS_NONE, + LLUUID::null, LLUUID::null, perm, + LLUUID::null, asset_type, inventory_type, + name, desc, LLSaleInfo::DEFAULT, + LLInventoryItemFlags::II_FLAGS_SUBTYPE_MASK & sub_type, time_corrected()); - object->saveScript(new_item, true, true); + object->saveScript(new_item, true, true, LLUUID::null); + } + else + { + LL_WARNS() << "Cannot create " << LLAssetType::lookup(asset_type) + << " — capability not available" << LL_ENDL; + } +} - std::string name = new_item->getName(); +void LLPanelContents::onNewNotecardCommit() +{ + const bool children_ok = true; + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); + if (!object) return; - // *NOTE: In order to resolve SL-22177, we needed to create - // the script first, and then you have to click it in - // inventory to edit it. - // *TODO: The script creation should round-trip back to the - // viewer so the viewer can auto-open the script and start - // editing ASAP. - } + createTaskInventoryItemHelper(object, + LLAssetType::AT_NOTECARD, + LLInventoryType::IT_NOTECARD, + 0, + "New Notecard", + LLSD()); } // static @@ -271,3 +383,40 @@ void LLPanelContents::onClickPermissions(void *userdata) LLPanelContents* self = (LLPanelContents*)userdata; gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterReg::showInstance("bulk_perms")); } + +void LLPanelContents::onClickPublish() +{ + const bool children_ok = true; + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); + if (!object) + { + LL_WARNS() << "No root object selected for publish/unpublish" << LL_ENDL; + return; + } + + auto server = LLScriptEditorWSServer::ensureServerRunning(); + if (!server) + { + LL_WARNS() << "Cannot publish/unpublish: WebSocket server failed to start" << LL_ENDL; + return; + } + + const LLUUID object_id = object->getID(); + if (server->getConnectionCount()) + { // if we already have at least one connection, then we can toggle the publish state of the object + if (server->isObjectPublished(object_id)) + { + server->unpublishObject(object_id, "user"); + } + else + { + server->publishObject(object_id); + } + } + else + { // if we don't have any connections, we need to build the url and launch vscode + // Launch VSCode + LLScriptEditorWSServer::launchVSCode(object_id); + + } +} diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index 6e02b17bab..bbbd828f3c 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -33,6 +33,7 @@ #include "lluuid.h" #include "llviewerobject.h" #include "llvoinventorylistener.h" +#include "llscripteditorws.h" #include "v3math.h" class LLButton; @@ -52,8 +53,17 @@ public: void clearContents(); - static void onClickNewScript(void*); + void onNewScriptFlyoutCommit(LLUICtrl* ctrl); + void onNewNotecardCommit(); static void onClickPermissions(void*); + void onClickPublish(); + + void createTaskInventoryItemHelper(LLViewerObject* object, + LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U8 sub_type, + const std::string& name, + const LLSD& params); // Key suffix for "tentative" fields static const char* TENTATIVE_SUFFIX; @@ -76,6 +86,7 @@ public: class LLFilterEditor* mFilterEditor; LLSaveFolderState mSavedFolderState; LLPanelObjectInventory* mPanelInventoryObject; + LLButton* mPublishButton { nullptr }; }; #endif // LL_LLPANELCONTENTS_H diff --git a/indra/newview/llpaneldirgroups.cpp b/indra/newview/llpaneldirgroups.cpp index 992d92091c..324d84efde 100644 --- a/indra/newview/llpaneldirgroups.cpp +++ b/indra/newview/llpaneldirgroups.cpp @@ -51,6 +51,12 @@ bool LLPanelDirGroups::postBuild() childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); setDefaultBtn( "Search" ); + if (gAgent.isTeen()) + { + childSetEnabled("incmature", false); + gSavedSettings.setBOOL("ShowMatureGroups", false); + } + return true; } @@ -72,11 +78,25 @@ void LLPanelDirGroups::performQuery() U32 scope = DFQ_GROUPS; // Check group mature filter. - if ( !gSavedSettings.getBOOL("ShowMatureGroups") || gAgent.isTeen() ) + if ( gSavedSettings.getBOOL("ShowMatureGroups") && !gAgent.isTeen() ) { + // Supposed behavior: + // if nothing is set will search for <= mature + // if DFQ_INC_PG is set, will look for <= PG + // if DFQ_INC_MATURE is set, will look for == mature + // if DFQ_INC_ADULT is set, will look for >= adult + // Not compatible with legacy DFQ_FILTER_MATURE. + // But there appears to be a server bug, so we only use + // this to show all and use legacy setting for 'pg only' + scope |= DFQ_INC_PG; + scope |= DFQ_INC_MATURE; + scope |= DFQ_INC_ADULT; + } + else + { + // DFQ_FILTER_MATURE is a legacy setting scope |= DFQ_FILTER_MATURE; } - mCurrentSortColumn = "score"; mCurrentSortAscending = false; diff --git a/indra/newview/llpaneldirland.cpp b/indra/newview/llpaneldirland.cpp index f85a8b948e..11ca7a0af0 100644 --- a/indra/newview/llpaneldirland.cpp +++ b/indra/newview/llpaneldirland.cpp @@ -183,7 +183,7 @@ void LLPanelDirLand::performQuery() if (list) { std::string sort_name = list->getSortColumnName(); - BOOL sort_asc = list->getSortAscending(); + bool sort_asc = list->getSortAscending(); if (sort_name == "name") { diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index e8cb53d263..534d7bee48 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -854,24 +854,56 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor } // Also align GLTF material if any - S32 gltf_info_index = 0; // base texture + LLGLTFMaterial::TextureInfo gltf_info_index = mPanel->getPBRTextureInfo(); LLVector2 gltf_offset, gltf_scale; F32 gltf_rot; - if (facep->calcAlignedPlanarGLTF(mCenterFace, &gltf_offset, &gltf_scale, &gltf_rot, gltf_info_index)) + + if (gltf_info_index == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT) { + // "Complete material" - update all texture transforms LLGLTFMaterial new_override; const LLTextureEntry* tep = object->getTE(te); if (tep && tep->getGLTFMaterialOverride()) { new_override = *tep->getGLTFMaterialOverride(); } + bool any_changed = false; + + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + if (facep->calcAlignedPlanarGLTF(mCenterFace, &gltf_offset, &gltf_scale, &gltf_rot, i)) + { + LLGLTFMaterial::TextureTransform& transform = new_override.mTextureTransform[i]; + transform.mOffset.set(gltf_offset.mV[0], gltf_offset.mV[1]); + transform.mScale.set(gltf_scale.mV[0], gltf_scale.mV[1]); + transform.mRotation = gltf_rot; + any_changed = true; + } + } + + if (any_changed) + { + LLGLTFMaterialList::queueModify(object, te, &new_override); + } + } + else + { + if (facep->calcAlignedPlanarGLTF(mCenterFace, &gltf_offset, &gltf_scale, &gltf_rot, gltf_info_index)) + { + LLGLTFMaterial new_override; + const LLTextureEntry* tep = object->getTE(te); + if (tep && tep->getGLTFMaterialOverride()) + { + new_override = *tep->getGLTFMaterialOverride(); + } - LLGLTFMaterial::TextureTransform& transform = new_override.mTextureTransform[gltf_info_index]; - transform.mOffset.set(gltf_offset.mV[0], gltf_offset.mV[1]); - transform.mScale.set(gltf_scale.mV[0], gltf_scale.mV[1]); - transform.mRotation = gltf_rot; + LLGLTFMaterial::TextureTransform& transform = new_override.mTextureTransform[gltf_info_index]; + transform.mOffset.set(gltf_offset.mV[0], gltf_offset.mV[1]); + transform.mScale.set(gltf_scale.mV[0], gltf_scale.mV[1]); + transform.mRotation = gltf_rot; - LLGLTFMaterialList::queueModify(object, te, &new_override); + LLGLTFMaterialList::queueModify(object, te, &new_override); + } } } if (!set_aligned) @@ -1073,6 +1105,9 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) // only turn on auto-adjust button if there is a media renderer and the media is loaded mBtnAlign->setEnabled(editable); + // enable if needed before changing selection + mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material); + if (mComboMatMedia->getCurrentIndex() < MATMEDIA_MATERIAL) { // When selecting an object with a pbr and UI combo is not set, @@ -1677,7 +1712,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mCheckFullbright->setValue((S32)(fullbright_flag != 0)); mCheckFullbright->setEnabled(editable && !has_pbr_material); mCheckFullbright->setTentative(!identical_fullbright); - mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material); } // Repeats per meter diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index e1f2d7588c..b4adbe0819 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1938,9 +1938,11 @@ LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab() mRolesList(NULL), mAssignedMembersList(NULL), mAllowedActionsList(NULL), + mActionDescription(NULL), mRoleName(NULL), mRoleTitle(NULL), mRoleDescription(NULL), + mMembersNotLoadedLbl(NULL), mMemberVisibleCheck(NULL), mDeleteRoleButton(NULL), mCopyRoleButton(NULL), @@ -1969,6 +1971,7 @@ bool LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root) mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members"); mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions"); mActionDescription = parent->getChild<LLTextEditor>("role_action_description"); + mMembersNotLoadedLbl = parent->getChild<LLUICtrl>("members_not_loaded"); mRoleName = parent->getChild<LLLineEditor>("role_name"); mRoleTitle = parent->getChild<LLLineEditor>("role_title"); @@ -2199,12 +2202,18 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) } } - if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) - && gdatap - && gdatap->isMemberDataComplete() - && gdatap->isRoleMemberDataComplete()) + if (gdatap && gdatap->isMemberDataComplete()) { - buildMembersList(); + if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) + && gdatap->isRoleMemberDataComplete()) + { + buildMembersList(); + } + mMembersNotLoadedLbl->setVisible(false); + } + else + { + mMembersNotLoadedLbl->setVisible(true); } } @@ -3224,6 +3233,12 @@ void LLPanelGroupBanListSubTab::setBanCount(U32 ban_count) void LLPanelGroupBanListSubTab::populateBanList() { + if (mGroupID.isNull()) + { + mBanList->deleteAllItems(); + return; + } + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); if(!gdatap) { diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index e320efa1c7..18c0e5dfea 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -297,6 +297,7 @@ protected: LLLineEditor* mRoleTitle; LLTextEditor* mRoleDescription; + LLUICtrl* mMembersNotLoadedLbl; LLCheckBoxCtrl* mMemberVisibleCheck; LLButton* mDeleteRoleButton; LLButton* mCreateRoleButton; diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp deleted file mode 100644 index 07a8641a92..0000000000 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @file llpanelimcontrolpanel.cpp - * @brief LLPanelIMControlPanel and related class implementations - * - * $LicenseInfo:firstyear=2004&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 "llfloaterreg.h" - -#include "llpanelimcontrolpanel.h" - -#include "llagent.h" -#include "llappviewer.h" // for gDisconnected -#include "llavataractions.h" -#include "llavatariconctrl.h" -#include "llbutton.h" -#include "llgroupactions.h" -#include "llavatarlist.h" -#include "llparticipantlist.h" -#include "llimview.h" -#include "llspeakers.h" -#include "lltrans.h" - - diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h deleted file mode 100644 index c7f5263bec..0000000000 --- a/indra/newview/llpanelimcontrolpanel.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file llpanelimcontrolpanel.h - * @brief LLPanelIMControlPanel and related class definitions - * - * $LicenseInfo:firstyear=2004&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_LLPANELIMCONTROLPANEL_H -#define LL_LLPANELIMCONTROLPANEL_H - -#include "llpanel.h" -#include "llcallingcard.h" - -class LLParticipantList; - -class LLPanelChatControlPanel - : public LLPanel -{ -public: - LLPanelChatControlPanel() : - mSessionId(LLUUID()) {}; - ~LLPanelChatControlPanel(); - - virtual BOOL postBuild(); - - virtual void setSessionId(const LLUUID& session_id); - const LLUUID& getSessionId() { return mSessionId; } - -private: - LLUUID mSessionId; - - // connection to voice channel state change signal - boost::signals2::connection mVoiceChannelStateChangeConnection; -}; - -class LLPanelGroupControlPanel : public LLPanelChatControlPanel -{ -public: - LLPanelGroupControlPanel(const LLUUID& session_id); - ~LLPanelGroupControlPanel(); - - BOOL postBuild(); - - void setSessionId(const LLUUID& session_id); - /*virtual*/ void draw(); - -protected: - LLUUID mGroupID; - - LLParticipantList* mParticipantList; - -private: - void onSortMenuItemClicked(const LLSD& userdata); -}; - -class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel -{ -public: - LLPanelAdHocControlPanel(const LLUUID& session_id); - - BOOL postBuild(); - -}; - -#endif // LL_LLPANELIMCONTROLPANEL_H diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp index 294bd4021d..feea97c4a9 100644 --- a/indra/newview/llpanellandmedia.cpp +++ b/indra/newview/llpanellandmedia.cpp @@ -135,8 +135,6 @@ void LLPanelLandMedia::refresh() mMediaURLEdit->setText(parcel->getMediaURL()); mMediaURLEdit->setEnabled( false ); - getChild<LLUICtrl>("current_url")->setValue(parcel->getMediaCurrentURL()); - mMediaDescEdit->setText(parcel->getMediaDesc()); mMediaDescEdit->setEnabled( can_change_media ); @@ -234,12 +232,9 @@ void LLPanelLandMedia::setMediaURL(const std::string& media_url) LLParcel *parcel = mParcel->getParcel(); if(parcel) parcel->setMediaCurrentURL(media_url); - // LLViewerMedia::navigateHome(); mMediaURLEdit->onCommit(); - // LLViewerParcelMedia::sendMediaNavigateMessage(media_url); - getChild<LLUICtrl>("current_url")->setValue(media_url); } std::string LLPanelLandMedia::getMediaURL() { @@ -322,8 +317,6 @@ void LLPanelLandMedia::onResetBtn(void *userdata) LLParcel* parcel = self->mParcel->getParcel(); // LLViewerMedia::navigateHome(); self->refresh(); - self->getChild<LLUICtrl>("current_url")->setValue(parcel->getMediaURL()); - // LLViewerParcelMedia::sendMediaNavigateMessage(parcel->getMediaURL()); } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 15cc8b421c..9b5a339958 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -205,7 +205,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mPasswordLength(0), mLocationLength(0), mShowFavorites(false), - mAlertNotif(false) + mAlertNotif(false), + mLoginBtn(nullptr) { setBackgroundVisible(false); setBackgroundOpaque(true); @@ -807,6 +808,8 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl) case LLSLURL::HOME_LOCATION: //location_combo->setCurrentByIndex(0); // home location break; + case LLSLURL::LAST_LOCATION: + break; default: LL_WARNS("AppInit")<<"invalid login slurl, using home"<<LL_ENDL; @@ -1219,6 +1222,10 @@ void LLPanelLogin::updateServer() void LLPanelLogin::updateLoginButtons() { + if (!mLoginBtn) + { + return; + } mLoginBtn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0 && !mAlertNotif); LLComboBox* user_combo = getChild<LLComboBox>("username_combo"); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 04eebcefc1..b8adb2d919 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -253,11 +253,21 @@ bool LLPanelMainInventory::postBuild() LLParamSDParser parser; parser.readSD(recent_items, p); mRecentPanel->getFilter().fromParams(p); - mRecentPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER)); + + // Restore sort order if it was saved + if (p.order.isProvided()) + { + mRecentPanel->setSortOrder(p.order()); + } + else + { + mRecentPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER)); + } } } if(mActivePanel) { + // 'all items' tab if(savedFilterState.has(mActivePanel->getFilter().getName())) { LLSD items = savedFilterState.get(mActivePanel->getFilter().getName()); diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index 557c7bbd7b..e0dbd9acd2 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -82,10 +82,20 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge LLInboxFolderViewFolder::Params params; - params.name = bridge->getDisplayName(); +#ifndef LL_RELEASE_FOR_DOWNLOAD + // Only usable for debug and first call has a large + // overhead from search string construction. + // As inventory names aren't unique and can change, + // there is little we can use them for in release builds. + params.name = bridge->getName(); +#else + // We don't have a source of unique names and inventory + // items can reach millions in quantity, just use + // a short descriptor + params.name = "fld"; +#endif params.root = mFolderRoot.get(); params.listener = bridge; - params.tool_tip = params.name; params.font_color = item_color; params.font_highlight_color = item_color; params.allow_drop = allow_drop; @@ -99,12 +109,22 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b LLInboxFolderViewItem::Params params; - params.name = bridge->getDisplayName(); +#ifndef LL_RELEASE_FOR_DOWNLOAD + // Only usable for debug and first call has a large + // overhead from search string construction. + // As inventory names aren't unique and can change, + // there is little we can use them for in release builds. + params.name = bridge->getName(); +#else + // We don't have a source of unique names and inventory + // items can reach millions in quantity, just use + // a short descriptor + params.name = "itm"; +#endif params.creation_date = bridge->getCreationDate(); params.root = mFolderRoot.get(); params.listener = bridge; params.rect = LLRect (0, 0, 0, 0); - params.tool_tip = params.name; params.font_color = item_color; params.font_highlight_color = item_color; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index d27ce81e4f..5f5c8302fe 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -897,9 +897,21 @@ public: const std::string& name) : LLTaskInvFVBridge(panel, uuid, name) {} + LLUIImagePtr getIcon() const override; + //static bool enableIfCopyable( void* userdata ); }; +// virtual +LLUIImagePtr LLTaskScriptBridge::getIcon() const +{ + // Pass the item's flags so the script subtype (e.g. SST_LUA) is honored + // and the correct icon (Inv_Script vs Inv_Script_Luau) is selected. + LLInventoryItem* item = findItem(); + U32 misc_flag = item ? item->getFlags() : 0; + return LLInventoryIcon::getIcon(mAssetType, mInventoryType, misc_flag, false); +} + class LLTaskLSLBridge : public LLTaskScriptBridge { public: @@ -1611,7 +1623,6 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li params.name = obj->getName(); params.root = mFolders; params.listener = bridge; - params.tool_tip = params.name; params.font_color = item_color; params.font_highlight_color = item_color; view = LLUICtrlFactory::create<LLFolderViewFolder>(params); @@ -1625,7 +1636,6 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li params.listener = bridge; params.creation_date = bridge->getCreationDate(); params.rect = LLRect(); - params.tool_tip = params.name; params.font_color = item_color; params.font_highlight_color = item_color; view = LLUICtrlFactory::create<LLFolderViewItem>(params); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index a9e860d2ef..2ddc09736f 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1309,7 +1309,7 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type showWearablesListView(); //e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE - applyListViewFilter(static_cast<EListViewItemType>(LVIT_SHAPE + type)); + applyListViewFilter(static_cast<EListViewItemType>(static_cast<U32>(LVIT_SHAPE) + static_cast<U32>(type))); mWearableItemsList->setMenuWearableType(type); } diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 5c866905d6..5dd4960542 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -84,6 +84,7 @@ static const std::string LANDMARK_INFO_TYPE = "landmark"; static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab"; +static const std::string TELEPORT_HISTORY_TAB_INFO_TYPE = "open_teleport_history_tab"; // Support for secondlife:///app/parcel/{UUID}/about SLapps class LLParcelHandler : public LLCommandHandler @@ -411,6 +412,15 @@ void LLPanelPlaces::onOpen(const LLSD& key) // Update the buttons at the bottom of the panel updateVerbs(); } + else if (key_type == TELEPORT_HISTORY_TAB_INFO_TYPE) + { + // toggle twice, similar to LANDMARK_TAB_INFO_TYPE + togglePlaceInfoPanel(false); + mPlaceInfoType = key_type; + togglePlaceInfoPanel(false); + onTabSelected(); + updateVerbs(); + } else if (key_type == CREATE_PICK_TYPE) { LLUUID item_id = key["item_id"]; @@ -1104,6 +1114,18 @@ void LLPanelPlaces::togglePlaceInfoPanel(bool visible) } } } + else if (mPlaceInfoType == TELEPORT_HISTORY_TAB_INFO_TYPE) + { + mLandmarkInfo->setVisible(false); + mPlaceProfile->setVisible(false); + if (!visible) + { + if (LLPanel* teleport_history_panel = mTabContainer->getPanelByName("Teleport History")) + { + mTabContainer->selectTabPanel(teleport_history_panel); + } + } + } } // virtual diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index c9626bf9ea..6870d719af 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -622,6 +622,7 @@ bool LLPanelProfilePick::postBuild() { mPickName = getChild<LLLineEditor>("pick_name"); mPickDescription = getChild<LLTextEditor>("pick_desc"); + mPickLocation = getChild<LLLineEditor>("pick_location"); mSaveButton = getChild<LLButton>("save_changes_btn"); mCreateButton = getChild<LLButton>("create_changes_btn"); mCancelButton = getChild<LLButton>("cancel_changes_btn"); @@ -646,11 +647,20 @@ bool LLPanelProfilePick::postBuild() mPickDescription->setKeystrokeCallback(boost::bind(&LLPanelProfilePick::onPickChanged, this, _1)); mPickDescription->setFocusReceivedCallback(boost::bind(&LLPanelProfilePick::onDescriptionFocusReceived, this)); - getChild<LLUICtrl>("pick_location")->setEnabled(false); + mPickLocation->setEnabled(false); return true; } +void LLPanelProfilePick::reshape(S32 width, S32 height, bool called_from_parent) +{ + LLPanelProfilePropertiesProcessorTab::reshape(width, height, called_from_parent); + if (mPickLocation) + { + mPickLocation->setCursor(0); + } +} + void LLPanelProfilePick::onDescriptionFocusReceived() { if (!mIsEditing && getSelfProfile()) @@ -749,7 +759,14 @@ void LLPanelProfilePick::setPickLocation(const LLUUID &parcel_id, const std::str void LLPanelProfilePick::setPickLocation(const std::string& location) { - getChild<LLUICtrl>("pick_location")->setValue(location); + mPickLocation->setValue(location); + // Pick location can be set with a long 'substitute' value or + // just a long value. + // If user sets cursor at the end, application of the substitute + // value can shift text from visible are to the left. When text + // gets restored or set, text position isn't, so just drop cursor + // position. + mPickLocation->setCursor(0); mPickLocationStr = location; mLastRequestTimer.reset(); } @@ -896,6 +913,10 @@ void LLPanelProfilePick::sendParcelInfoRequest() void LLPanelProfilePick::processParcelInfo(const LLParcelData& parcel_data) { + // Region might have moved since the pick was saved; refresh the stored global position + // using the parcel info so map/teleport use the current location. + setPosGlobal(LLVector3d(parcel_data.global_x, parcel_data.global_y, parcel_data.global_z)); + setPickLocation(createLocationText(LLStringUtil::null, parcel_data.name, parcel_data.sim_name, getPosGlobal())); // We have received parcel info for the requested ID so clear it now. diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h index 847ac57cea..b925f09f92 100644 --- a/indra/newview/llpanelprofilepicks.h +++ b/indra/newview/llpanelprofilepicks.h @@ -112,6 +112,8 @@ public: void setAvatarId(const LLUUID& avatar_id) override; + void reshape(S32 width, S32 height, bool called_from_parent = true) override; + void setPickId(const LLUUID& id) { mPickId = id; } virtual LLUUID& getPickId() { return mPickId; } @@ -228,13 +230,14 @@ public: protected: - LLTextureCtrl* mSnapshotCtrl; - LLLineEditor* mPickName; - LLTextEditor* mPickDescription; - LLButton* mSetCurrentLocationButton; - LLButton* mSaveButton; - LLButton* mCreateButton; - LLButton* mCancelButton; + LLTextureCtrl* mSnapshotCtrl = nullptr; + LLLineEditor* mPickName = nullptr; + LLTextEditor* mPickDescription = nullptr; + LLLineEditor* mPickLocation = nullptr; + LLButton* mSetCurrentLocationButton = nullptr; + LLButton* mSaveButton = nullptr; + LLButton* mCreateButton = nullptr; + LLButton* mCancelButton = nullptr; LLVector3d mPosGlobal; LLUUID mParcelId; diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index 56c0294dbe..daf1986522 100644 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -64,7 +64,12 @@ bool LLPanelSnapshot::postBuild() { S32 w = getTypedPreviewWidth(); S32 h = getTypedPreviewHeight(); - getChild<LLUICtrl>("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost(w, h))); + LLUICtrl *save_btn = findChild<LLUICtrl>("save_btn"); + if (save_btn) + { + // Not all snapshot floaters have a save button + save_btn->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost(w, h))); + } getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1)); if (!getWidthSpinnerName().empty()) { @@ -193,7 +198,11 @@ void LLPanelSnapshot::updateImageQualityLevel() quality_lvl = LLTrans::getString("snapshot_quality_very_high"); } - getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl); + LLTextBox* quality_lvl_ctrl = findChild<LLTextBox>("image_quality_level"); + if (quality_lvl_ctrl) + { + quality_lvl_ctrl->setTextArg("[QLVL]", quality_lvl); + } } void LLPanelSnapshot::goBack() diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 5aaa53b732..609177046e 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -149,7 +149,7 @@ void LLPanelVoiceDeviceSettings::draw() LLColor4 color; if (power_bar_idx < discrete_power) { - color = (power_bar_idx >= 3) ? LLUIColorTable::instance().getColor("OverdrivenColor") : LLUIColorTable::instance().getColor("SpeakingColor"); + color = (power_bar_idx >= 3) ? LLUIColorTable::instance().getColor("OverdrivenColor") : LLUIColorTable::instance().getColor("OutfitGalleryItemSelected"); } else { diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp index c9fbeba2f3..5bb33a65f2 100644 --- a/indra/newview/llpathfindingnavmesh.cpp +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -139,7 +139,8 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes ENavMeshRequestStatus status; if ( pContent.has(NAVMESH_DATA_FIELD) ) { - const LLSD::Binary &value = pContent.get(NAVMESH_DATA_FIELD).asBinary(); + LLSD nav_data = pContent.get(NAVMESH_DATA_FIELD); + const LLSD::Binary& value = nav_data.asBinary(); auto binSize = value.size(); std::string newStr(reinterpret_cast<const char *>(&value[0]), binSize); std::istringstream streamdecomp( newStr ); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index eefd19e153..af3e64c451 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -70,10 +70,16 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id, : LLPreview( key ) { const LLInventoryItem *item = getItem(); + std::string note_name = "New Note"; if (item) { mAssetID = item->getAssetUUID(); + if (!item->getName().empty()) + { + note_name = item->getName(); + } } + mNoteName = note_name; } LLPreviewNotecard::~LLPreviewNotecard() @@ -102,15 +108,21 @@ bool LLPreviewNotecard::postBuild() mEditBtn->setCommitCallback(boost::bind(&LLPreviewNotecard::openInExternalEditor, this)); const LLInventoryItem* item = getItem(); + std::string note_name = mNoteName; mDescEditor = getChild<LLLineEditor>("desc"); mDescEditor->setCommitCallback(boost::bind(&LLPreview::onText, mDescEditor, this)); if (item) { + if (!item->getName().empty()) + { + note_name = item->getName(); + } mDescEditor->setValue(item->getDescription()); bool source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()); mDeleteBtn->setEnabled(!source_library); } + mNoteName = note_name; mDescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); @@ -231,6 +243,7 @@ void LLPreviewNotecard::loadAsset() // request the asset. const LLInventoryItem* item = getItem(); bool fail = false; + std::string note_name = mNoteName; if(item) { @@ -239,6 +252,10 @@ void LLPreviewNotecard::loadAsset() bool allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE); bool allow_modify = canModify(mObjectUUID, item); bool source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID()); + if(!item->getName().empty()) + { + note_name = item->getName(); + } if (allow_copy || gAgent.isGodlike()) { @@ -339,6 +356,8 @@ void LLPreviewNotecard::loadAsset() fail = true; } + mNoteName = note_name; + if (fail) { mEditor->setText(LLStringUtil::null); @@ -575,13 +594,23 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem, bool sync) void LLPreviewNotecard::syncExternal() { // Sync with external editor. - std::string tmp_file = getTmpFileName(); + std::string note_name = getCleanNameForTmpFile(); + std::string tmp_file = getTmpFileName(note_name); llstat s; - if (LLFile::stat(tmp_file, &s) == 0) // file exists + if (LLFile::stat(tmp_file, &s) != 0) { - if (mLiveFile) mLiveFile->ignoreNextUpdate(); - writeToFile(tmp_file); + // file doesn't exist, try with empty name + note_name.clear(); + tmp_file = getTmpFileName(note_name); + if (LLFile::stat(tmp_file, &s) != 0) + { + // file doesn't exist, with either name, give up + return; + } } + + if (mLiveFile) mLiveFile->ignoreNextUpdate(); + writeToFile(tmp_file); } /*virtual*/ @@ -744,8 +773,16 @@ void LLPreviewNotecard::openInExternalEditor() delete mLiveFile; // deletes file // Save the notecard to a temporary file. - std::string filename = getTmpFileName(); - writeToFile(filename); + std::string note_name = getCleanNameForTmpFile(); + std::string filename = getTmpFileName(note_name); + if(!writeToFile(filename)) { + // In case some characters from notecard name are forbidden + // and not accounted for, name is too long or some other issue, + // try file that doesn't include notecard name + note_name.clear(); + filename = getTmpFileName(note_name); + writeToFile(filename); + } // Start watching file changes. mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLPreviewNotecard::onExternalChange, this, _1)); @@ -803,7 +840,7 @@ bool LLPreviewNotecard::loadNotecardText(const std::string& filename) return false; } - LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + LLFILE* file = LLFile::fopen(filename, LLFILE_MODE("rb")); /*Flawfinder: ignore*/ if (!file) { LL_WARNS() << "Error opening " << filename << LL_ENDL; @@ -834,7 +871,7 @@ bool LLPreviewNotecard::loadNotecardText(const std::string& filename) bool LLPreviewNotecard::writeToFile(const std::string& filename) { - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("wb")); if (!fp) { LL_WARNS() << "Unable to write to " << filename << LL_ENDL; @@ -853,8 +890,21 @@ bool LLPreviewNotecard::writeToFile(const std::string& filename) return true; } +std::string LLPreviewNotecard::getCleanNameForTmpFile() const +{ + std::string note_name = mNoteName; + if(note_name.empty()) { + note_name = "New note"; + } + static const std::set<char> forbidden_chars{ '<', '>', ':', '"', '\\', '/', '|', '?', '*' }; + note_name.erase( + std::remove_if(note_name.begin(), note_name.end(), [](char c) { + return forbidden_chars.contains(c); + }), note_name.end()); + return note_name; +} -std::string LLPreviewNotecard::getTmpFileName() +std::string LLPreviewNotecard::getTmpFileName(const std::string& note_name) const { std::string notecard_id = mObjectID.asString() + "_" + mItemUUID.asString(); @@ -863,7 +913,11 @@ std::string LLPreviewNotecard::getTmpFileName() LLMD5 notecard_id_hash((const U8 *)notecard_id.c_str()); notecard_id_hash.hex_digest(notecard_id_hash_str); - return std::string(LLFile::tmpdir()) + "sl_notecard_" + notecard_id_hash_str + ".txt"; + if(note_name.empty()) { + return std::string(LLFile::tmpdir()) + "sl_notecard_" + notecard_id_hash_str + ".txt"; + } else { + return std::string(LLFile::tmpdir()) + "sl_notecard_" + note_name + "_" + notecard_id_hash_str + ".txt"; + } } diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index be3c804f9b..a7289ebc9a 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -108,7 +108,8 @@ protected: bool onExternalChange(const std::string& filename); bool loadNotecardText(const std::string& filename); bool writeToFile(const std::string& filename); - std::string getTmpFileName(); + std::string getCleanNameForTmpFile() const; + std::string getTmpFileName(const std::string& note_name) const; protected: LLViewerTextEditor* mEditor = nullptr; @@ -118,6 +119,8 @@ protected: LLButton* mDeleteBtn = nullptr; LLUICtrl* mLockBtn = nullptr; + std::string mNoteName; + LLUUID mAssetID; LLUUID mObjectID; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index c2aa4925bd..354147336a 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -40,7 +40,6 @@ #include "llinventorymodel.h" #include "llkeyboard.h" #include "lllineeditor.h" -#include "llmd5.h" #include "llhelp.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -53,6 +52,7 @@ #include "llslider.h" #include "lltooldraganddrop.h" #include "llfilesystem.h" +#include "lllogchat.h" #include "llagent.h" #include "llmenugl.h" @@ -64,22 +64,12 @@ #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" -#include "llkeyboard.h" -#include "llscrollcontainer.h" -#include "llcheckboxctrl.h" #include "llscripteditor.h" -#include "llselectmgr.h" -#include "lltooldraganddrop.h" -#include "llscrolllistctrl.h" #include "lltextbox.h" -#include "llslider.h" -#include "lldir.h" -#include "llcombobox.h" #include "llviewerstats.h" #include "llviewerwindow.h" #include "lluictrlfactory.h" #include "llmediactrl.h" -#include "lluictrlfactory.h" #include "lltrans.h" #include "llviewercontrol.h" #include "llappviewer.h" @@ -90,20 +80,10 @@ #include "lltoggleablemenu.h" #include "llmenubutton.h" #include "llinventoryfunctions.h" +#include "llwebsocketmgr.h" +#include "llscripteditorws.h" +#include <regex> -const std::string HELLO_LSL = - "default\n" - "{\n" - " state_entry()\n" - " {\n" - " llSay(0, \"Hello, Avatar!\");\n" - " }\n" - "\n" - " touch_start(integer total_number)\n" - " {\n" - " llSay(0, \"Touched.\");\n" - " }\n" - "}\n"; const std::string HELP_LSL_PORTAL_TOPIC = "LSL_Portal"; const std::string DEFAULT_SCRIPT_NAME = "New Script"; // *TODO:Translate? @@ -119,6 +99,42 @@ static bool have_script_upload_cap(LLUUID& object_id) return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty()); } +static bool have_lua_enabled(const LLUUID& object_id) +{ + LLViewerRegion* region = nullptr; + LLViewerObject* object = gObjectList.findObject(object_id); + if (object) + { + region = object->getRegion(); + } + else + { + region = gAgent.getRegion(); + } + + if (region && region->simulatorFeaturesReceived()) + { + LLSD simulatorFeatures; + region->getSimulatorFeatures(simulatorFeatures); + return simulatorFeatures["LuaScriptsEnabled"].asBoolean(); + } + + return false; +} + +// TEMPORARY: Quick check to see if the code is Lua +// since we don't have another way to determine the language yet +bool is_lua_script(const std::string& code) +{ + // Check for LSL's signature "default" state pattern + std::regex lsl_pattern("\\s*default\\s*\\{"); + if (std::regex_search(code, lsl_pattern)) + return false; + + // "default" state not found, assuming it's Lua + return true; +} + /// --------------------------------------------------------------------------- /// LLLiveLSLFile /// --------------------------------------------------------------------------- @@ -373,9 +389,9 @@ LLScriptEdCore::LLScriptEdCore( LLScriptEdContainer* container, const std::string& sample, const LLHandle<LLFloater>& floater_handle, - void (*load_callback)(void*), - void (*save_callback)(void*, bool), - void (*search_replace_callback) (void* userdata), + script_ed_callback_t load_callback, + save_callback_t save_callback, + script_ed_callback_t search_replace_callback, void* userdata, bool live, S32 bottom_pad) @@ -391,7 +407,6 @@ LLScriptEdCore::LLScriptEdCore( mLastHelpToken(NULL), mLiveHelpHistorySize(0), mEnableSave(false), - mLiveFile(NULL), mLive(live), mContainer(container), mHasScriptData(false), @@ -423,7 +438,6 @@ LLScriptEdCore::~LLScriptEdCore() } } - delete mLiveFile; if (mSyntaxIDConnection.connected()) { mSyntaxIDConnection.disconnect(); @@ -441,42 +455,37 @@ void LLLiveLSLEditor::experienceChanged() } } -void LLLiveLSLEditor::onViewProfile( LLUICtrl *ui, void* userdata ) +void LLLiveLSLEditor::onViewProfile() { - LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; - - LLUUID id; - if(self->mExperienceEnabled->get()) + if (mExperienceEnabled->get()) { - id=self->mScriptEd->getAssociatedExperience(); - if(id.notNull()) + LLUUID id = mScriptEd->getAssociatedExperience(); + if (id.notNull()) { LLFloaterReg::showInstance("experience_profile", id, true); } } - } -void LLLiveLSLEditor::onToggleExperience( LLUICtrl *ui, void* userdata ) +void LLLiveLSLEditor::onToggleExperience() { - LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; - LLUUID id; - if(self->mExperienceEnabled->get()) + if (mExperienceEnabled->get()) { - if(self->mScriptEd->getAssociatedExperience().isNull()) + if (mScriptEd->getAssociatedExperience().isNull()) { - id=self->mExperienceIds.beginArray()->asUUID(); + id = mExperienceIds.beginArray()->asUUID(); } } - if(id != self->mScriptEd->getAssociatedExperience()) + if (id != mScriptEd->getAssociatedExperience()) { - self->mScriptEd->enableSave(self->getIsModifiable()); + mScriptEd->enableSave(getIsModifiable()); } - self->mScriptEd->setAssociatedExperience(id); - self->updateExperiencePanel(); + mScriptEd->setAssociatedExperience(id); + + updateExperiencePanel(); } bool LLScriptEdCore::postBuild() @@ -497,10 +506,10 @@ bool LLScriptEdCore::postBuild() initMenu(); - mSyntaxIDConnection = LLSyntaxIdLSL::getInstance()->addSyntaxIDCallback(boost::bind(&LLScriptEdCore::processKeywords, this)); + mSyntaxIDConnection = LLSyntaxDefCache::getInstance()->addSyntaxIDCallback(boost::bind(&LLScriptEdCore::processKeywords, this)); // Intialise keyword highlighting for the current simulator's version of LSL - LLSyntaxIdLSL::getInstance()->initialize(); + LLSyntaxDefCache::getInstance(); processKeywords(); mCommitCallbackRegistrar.add("FontSize.Set", boost::bind(&LLScriptEdCore::onChangeFontSize, this, _2)); @@ -510,14 +519,30 @@ bool LLScriptEdCore::postBuild() "menu_lsl_font_size.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); getChild<LLMenuButton>("font_btn")->setMenu(context_menu, LLMenuButton::MP_BOTTOM_LEFT, true); + bool lua_scripts_enabled = have_lua_enabled(LLUUID::null); + mCompileTarget = getChild<LLComboBox>("compile_target"); + if (LLScrollListItem* luau_item = mCompileTarget->findItemByValue("luau")) + { + luau_item->setEnabled(lua_scripts_enabled); + } + if (LLScrollListItem* lsl_luau_item = mCompileTarget->findItemByValue("lsl-luau")) + { + lsl_luau_item->setEnabled(lua_scripts_enabled); + } + return true; } void LLScriptEdCore::processKeywords() { + processKeywords(mEditor->getIsLuauLanguage()); +} + +void LLScriptEdCore::processKeywords(bool luau_language) +{ LL_DEBUGS("SyntaxLSL") << "Processing keywords" << LL_ENDL; mEditor->clearSegments(); - mEditor->initKeywords(); + mEditor->initKeywords(luau_language); mEditor->loadKeywords(); string_vec_t primary_keywords; @@ -536,6 +561,8 @@ void LLScriptEdCore::processKeywords() secondary_keywords.push_back( wstring_to_utf8str(token->getToken()) ); } } + + mFunctions->removeall(); for (string_vec_t::const_iterator iter = primary_keywords.begin(); iter!= primary_keywords.end(); ++iter) { @@ -632,7 +659,7 @@ bool LLScriptEdCore::loadScriptText(const std::string& filename) return false; } - LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + LLFILE* file = LLFile::fopen(filename, LLFILE_MODE("rb")); /*Flawfinder: ignore*/ if (!file) { LL_WARNS() << "Error opening " << filename << LL_ENDL; @@ -663,7 +690,7 @@ bool LLScriptEdCore::loadScriptText(const std::string& filename) bool LLScriptEdCore::writeToFile(const std::string& filename) { - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("wb")); if (!fp) { LL_WARNS() << "Unable to write to " << filename << LL_ENDL; @@ -691,13 +718,13 @@ bool LLScriptEdCore::writeToFile(const std::string& filename) void LLScriptEdCore::sync() { // Sync with external editor. - if (mLiveFile) + if (mContainer->mLiveFile) { - std::string tmp_file = mLiveFile->filename(); + std::string tmp_file = mContainer->mLiveFile->filename(); llstat s; if (LLFile::stat(tmp_file, &s) == 0) // file exists { - mLiveFile->ignoreNextUpdate(); + mContainer->mLiveFile->ignoreNextUpdate(); writeToFile(tmp_file); } } @@ -721,6 +748,8 @@ void LLScriptEdCore::draw() S32 line = 0; S32 column = 0; mEditor->getCurrentLineAndColumn( &line, &column, false ); // don't include wordwrap + line = mEditor->getIsLuauLanguage() ? (line + 1) : line; + column = mEditor->getIsLuauLanguage() ? (column + 1) : column; LLStringUtil::format_map_t args; std::string cursor_pos; args["[LINE]"] = llformat ("%d", line); @@ -1083,34 +1112,75 @@ void LLScriptEdCore::doSave( bool close_after_save ) void LLScriptEdCore::openInExternalEditor() { - delete mLiveFile; // deletes file + //if (mContainer->mLiveFile) + //{ + // // If already open in an external editor, just return + // return; + //} // Generate a suitable filename std::string script_name = mScriptName; - std::string forbidden_chars = "<>:\"\\/|?*"; - for (std::string::iterator c = forbidden_chars.begin(); c != forbidden_chars.end(); c++) - { - script_name.erase(std::remove(script_name.begin(), script_name.end(), *c), script_name.end()); - } + + static const std::set<char> forbidden_chars{ '<', '>', ':', '"', '\\', '/', '|', '?', '*' }; + script_name.erase( + std::remove_if(script_name.begin(), script_name.end(), [](char c) { + return forbidden_chars.contains(c); + }), script_name.end()); + std::string filename = mContainer->getTmpFileName(script_name); - // Save the script to a temporary file. - if (!writeToFile(filename)) + if (LLScriptEditorWSServer::isTightIntegration()) { - // In case some characters from script name are forbidden - // and not accounted for, name is too long or some other issue, - // try file that doesn't include script name - script_name.clear(); - filename = mContainer->getTmpFileName(script_name); - writeToFile(filename); - } + // VS Code tight integration path. + // The extension opens the script as a virtual sl:// document; no temp file is needed. + auto server = LLScriptEditorWSServer::ensureServerRunning(); + if (server) + { + mContainer->mWebSocketServer = server; - // Start watching file changes. - mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdContainer::onExternalChange, mContainer, _1)); - mLiveFile->addToEventTimer(); + LLViewerObject* object = gObjectList.findObject(mContainer->mObjectUUID); + LLViewerObject* root_object = object ? object->getRootEdit() : nullptr; + LLUUID root_id = root_object ? root_object->getID() : mContainer->mObjectUUID; - // Open it in external editor. + if (!LLScriptEditorWSServer::launchVSCode(root_id, mContainer->mItemUUID)) + { + LLNotificationsUtil::add("GenericAlert", + LLSD().with("MESSAGE", LLTrans::getString("VSCodeLaunchFailed"))); + } + } + else + { + LLNotificationsUtil::add("GenericAlert", + LLSD().with("MESSAGE", LLTrans::getString("ExternalEditorFailedToStart"))); + } + } + else { + // Legacy external editor path: write temp file, watch it, open in external editor. + if (!writeToFile(filename)) + { + // In case some characters from script name are forbidden + // and not accounted for, name is too long or some other issue, + // try file that doesn't include script name + script_name.clear(); + filename = mContainer->getTmpFileName(script_name); + writeToFile(filename); + } + + if (mContainer->mLiveFile && mContainer->mLiveFile->filename() != filename) + { // The name may have changed if we changed the type of script being edited. + delete mContainer->mLiveFile; + mContainer->mLiveFile = NULL; + } + // Start watching file changes. + if (!mContainer->mLiveFile) + { + mContainer->mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdContainer::onExternalChange, mContainer, _1)); + mContainer->mLiveFile->addToEventTimer(); + } + + mContainer->startWebsocketServer(); + LLExternalEditor ed; LLExternalEditor::EErrorCode status; std::string msg; @@ -1166,6 +1236,7 @@ void LLScriptEdCore::onErrorList(LLUICtrl*, void* user_data) sscanf(line.c_str(), "%d %d", &row, &column); //LL_INFOS() << "LLScriptEdCore::onErrorList() - " << row << ", " //<< column << LL_ENDL; + row = (self->mEditor->getIsLuauLanguage() ? row - 1 : row); self->mEditor->setCursor(row, column); self->mEditor->setFocus(true); } @@ -1376,15 +1447,15 @@ void LLLiveLSLEditor::updateExperiencePanel() mExperienceEnabled->setEnabled(false); mExperienceEnabled->setToolTip(getString("no_experiences")); } - getChild<LLButton>("view_profile")->setVisible(false); + mViewProfileButton->setVisible(false); } else { mExperienceEnabled->setToolTip(getString("experience_enabled")); mExperienceEnabled->setEnabled(getIsModifiable()); - mExperiences->setVisible(true); mExperienceEnabled->set(true); - getChild<LLButton>("view_profile")->setToolTip(getString("show_experience_profile")); + mExperiences->setVisible(true); + mViewProfileButton->setToolTip(getString("show_experience_profile")); buildExperienceList(); } } @@ -1453,7 +1524,7 @@ void LLLiveLSLEditor::buildExperienceList() mExperiences->setEnabled(true); mExperiences->sortByName(true); mExperiences->setCurrentByIndex(mExperiences->getCurrentIndex()); - getChild<LLButton>("view_profile")->setVisible(true); + mViewProfileButton->setVisible(true); } } @@ -1463,8 +1534,6 @@ void LLScriptEdCore::setAssociatedExperience( const LLUUID& experience_id ) mAssociatedExperience = experience_id; } - - void LLLiveLSLEditor::requestExperiences() { if (!getIsModifiable()) @@ -1503,30 +1572,101 @@ void LLLiveLSLEditor::receiveExperienceIds(LLSD result, LLHandle<LLLiveLSLEditor LLScriptEdContainer::LLScriptEdContainer(const LLSD& key) : LLPreview(key) -, mScriptEd(NULL) +, mScriptEd(nullptr) +, mLiveFile(nullptr) +, mLiveLogFile(nullptr) +{ +} + +LLScriptEdContainer::~LLScriptEdContainer() +{ + delete mLiveFile; + mLiveFile = nullptr; + + delete mLiveLogFile; + mLiveLogFile = nullptr; + + if (!mWebSocketServer.expired()) + { + unsubscribeScript(); + } +} + +std::string LLScriptEdContainer::getTmpFileName(const std::string& script_name) const { + std::string script_id_hash_str(getUniqueHash()); + std::string script_extension = mScriptEd->mEditor->getIsLuauLanguage() ? ".luau" : ".lsl"; + + if (script_name.empty()) + { + return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + script_extension; + } + else + { + return std::string(LLFile::tmpdir()) + "sl_script_" + script_name + "_" + script_id_hash_str + script_extension; + } } -std::string LLScriptEdContainer::getTmpFileName(const std::string& script_name) +std::string LLScriptEdContainer::getUniqueHash() const { // Take script inventory item id (within the object inventory) // to consideration so that it's possible to edit multiple scripts // in the same object inventory simultaneously (STORM-781). - std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString(); + return LLScriptEditorWSServer::buildScriptSubscriptionId(mObjectUUID, mItemUUID); +} - // Use MD5 sum to make the file name shorter and not exceed maximum path length. - char script_id_hash_str[33]; /* Flawfinder: ignore */ - LLMD5 script_id_hash((const U8 *)script_id.c_str()); - script_id_hash.hex_digest(script_id_hash_str); +std::string LLScriptEdContainer::getErrorLogFileName(const std::string& script_path) +{ + if (script_path.empty()) + { + return std::string(); + } - if (script_name.empty()) + return script_path + ".log"; +} + +bool LLScriptEdContainer::logErrorsToFile(const LLSD& compile_errors) +{ + if (!isOpenInExternalEditor()) { - return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl"; + return false; } - else + + std::string script_path = getTmpFileName(mScriptEd->mScriptName); + std::string log_path = getErrorLogFileName(script_path); + + llofstream file(log_path.c_str()); + if (!file.is_open()) + { + LL_WARNS() << "Unable to open error log file: " << log_path << LL_ENDL; + return false; + } + + // Write timestamp + std::string timestamp = LLLogChat::timestamp2LogString(0, true); + file << "// " << timestamp << "\n\n"; + + // Write errors + for (LLSD::array_const_iterator line = compile_errors.beginArray(); + line < compile_errors.endArray(); + line++) + { + std::string error_message = line->asString(); + LLStringUtil::stripNonprintable(error_message); + file << error_message << "\n"; + } + + file.close(); + + // Create a log file handler if we don't already have one, + // this is needed to delete the temporary log file properly + if (!mLiveLogFile && !log_path.empty()) { - return std::string(LLFile::tmpdir()) + "sl_script_" + script_name + "_" + script_id_hash_str + ".lsl"; + // Empty callback since we don't need to react to file changes + mLiveLogFile = new LLLiveLSLFile(log_path, [](const std::string& filename) { return true; }); } + + return true; } bool LLScriptEdContainer::onExternalChange(const std::string& filename) @@ -1556,6 +1696,40 @@ bool LLScriptEdContainer::handleKeyHere(KEY key, MASK mask) return true; } +void LLScriptEdContainer::startWebsocketServer() +{ + auto server = LLScriptEditorWSServer::ensureServerRunning(); + if (!server) + { + return; + } + + std::string script_id_hash_str(getUniqueHash()); + server->subscribeScriptEditor(mObjectUUID, mItemUUID, mScriptEd->mScriptName, getHandle(), script_id_hash_str); + mWebSocketServer = server; +} + +void LLScriptEdContainer::unsubscribeScript() +{ + auto server = mWebSocketServer.lock(); + if (server) + { + std::string script_id_hash_str(getUniqueHash()); + server->sendUnsubscribeScriptEditor(script_id_hash_str); + server->unsubscribeEditor(script_id_hash_str); + } +} + +void LLScriptEdContainer::sendCompileResults(LLSD& params) +{ + auto server = mWebSocketServer.lock(); + if (server) + { + std::string script_id_hash_str(getUniqueHash()); + server->sendCompileResults(script_id_hash_str, params); + } +} + /// --------------------------------------------------------------------------- /// LLPreviewLSL /// --------------------------------------------------------------------------- @@ -1580,7 +1754,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata) self->mScriptEd = new LLScriptEdCore( self, - HELLO_LSL, + std::string(), self->getHandle(), LLPreviewLSL::onLoad, LLPreviewLSL::onSave, @@ -1624,6 +1798,9 @@ bool LLPreviewLSL::postBuild() childSetCommitCallback("desc", LLPreview::onText, this); getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); + mScriptEd->mCompileTarget = getChild<LLComboBox>("compile_target"); + mScriptEd->mCompileTarget->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCompileTargetChanged(); }); + return LLPreview::postBuild(); } @@ -1649,6 +1826,15 @@ void LLPreviewLSL::callbackLSLCompileSucceeded() LL_INFOS() << "LSL Bytecode saved" << LL_ENDL; mScriptEd->mErrorList->setCommentText(LLTrans::getString("CompileSuccessful")); mScriptEd->mErrorList->setCommentText(LLTrans::getString("SaveComplete")); + + if (isOpenInExternalEditor()) + { + LLSD success_msg; + success_msg.append(LLTrans::getString("CompileSuccessful")); + success_msg.append(LLTrans::getString("SaveComplete")); + logErrorsToFile(success_msg); + } + closeIfNeeded(); } @@ -1668,6 +1854,12 @@ void LLPreviewLSL::callbackLSLCompileFailed(const LLSD& compile_errors) row["columns"][0]["font"] = "OCRA"; mScriptEd->mErrorList->addElement(row); } + + if (isOpenInExternalEditor()) + { + logErrorsToFile(compile_errors); + } + mScriptEd->selectFirstError(); closeIfNeeded(); } @@ -1718,12 +1910,6 @@ void LLPreviewLSL::loadAsset() getChildView("lock")->setVisible( !is_modifiable); mScriptEd->getChildView("Insert...")->setEnabled(is_modifiable); } - else - { - mScriptEd->setScriptText(std::string(HELLO_LSL), true); - mScriptEd->setEnableEditing(true); - mAssetStatus = PREVIEW_ASSET_LOADED; - } } @@ -1781,6 +1967,7 @@ void LLPreviewLSL::finishedLSLUpload(LLUUID itemId, LLSD response) { preview->callbackLSLCompileFailed(response["errors"]); } + preview->sendCompileResults(response); } } @@ -1804,6 +1991,12 @@ bool LLPreviewLSL::failedLSLUpload(LLUUID itemId, LLUUID taskId, LLSD response, LLSD errors; errors.append(LLTrans::getString("UploadFailed") + reason); preview->callbackLSLCompileFailed(errors); + + LLSD message; + message["compiled"] = false; + message["errors"] = errors; + preview->sendCompileResults(message); + return true; } @@ -1839,11 +2032,12 @@ void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/) mPendingUploads++; if (!url.empty()) { + std::string compile_target(mScriptEd->mCompileTarget->getValue()); std::string buffer(mScriptEd->mEditor->getText()); LLUUID old_asset_id = inv_item->getAssetUUID().isNull() ? mScriptEd->getAssetID() : inv_item->getAssetUUID(); - LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLScriptAssetUpload>(mItemUUID, buffer, + LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLScriptAssetUpload>(mItemUUID, compile_target, buffer, [old_asset_id](LLUUID itemId, LLUUID, LLUUID, LLSD response) { LLFileSystem::removeFile(old_asset_id, LLAssetType::AT_LSL_TEXT); LLPreviewLSL::finishedLSLUpload(itemId, response); @@ -1855,6 +2049,13 @@ void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/) } } +void LLPreviewLSL::onCompileTargetChanged() +{ + bool is_lua = (mScriptEd->mCompileTarget->getValue().asString() == "luau"); + mScriptEd->mEditor->setLuauLanguage(is_lua); + mScriptEd->processKeywords(is_lua); +} + // static void LLPreviewLSL::onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status) @@ -1881,6 +2082,8 @@ void LLPreviewLSL::onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType t std::string script_name = DEFAULT_SCRIPT_NAME; LLInventoryItem* item = gInventory.getItem(*item_uuid); bool is_modifiable = false; + std::string compile_target; + bool is_lua = false; if (item) { if (!item->getName().empty()) @@ -1891,11 +2094,44 @@ void LLPreviewLSL::onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType t { is_modifiable = true; } + + // subtype is the language that the script is written in, + // runtime is the VM that the script is running on. + // LSL scripts have 3 possible runtimes: "lsl2", "mono", and "luau". + // Lua scripts have 1 runtime: "luau". + U8 subtype = item->getInventorySubType(); + std::string runtime = item->getRuntime(); + + is_lua = (subtype == SST_LUA); + if (!is_lua && (runtime == "luau")) + { // an lsl script executing on the luau runtime + compile_target = "lsl-luau"; + } + else + { // otherwise, use the runtime as the compile target + // (this may be blank if the script has never been compiled) + compile_target = runtime; + } } + + if (compile_target.empty()) + { + if (!is_lua) + { + // No language info from inventory metadata; fall back to content analysis. + is_lua = is_lua_script(std::string(&buffer[0], file_length)); + } + compile_target = is_lua ? "luau" : "mono"; + } + preview->mScriptEd->setScriptName(script_name); preview->mScriptEd->setEnableEditing(is_modifiable); preview->mScriptEd->setAssetID(asset_uuid); preview->mAssetStatus = PREVIEW_ASSET_LOADED; + + preview->mScriptEd->mCompileTarget->setValue(compile_target); + preview->mScriptEd->mEditor->setLuauLanguage(is_lua); + preview->mScriptEd->processKeywords(is_lua); } else { @@ -1933,7 +2169,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata) self->mScriptEd = new LLScriptEdCore( self, - HELLO_LSL, + std::string(), self->getHandle(), &LLLiveLSLEditor::onLoad, &LLLiveLSLEditor::onSave, @@ -1961,28 +2197,26 @@ LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) : bool LLLiveLSLEditor::postBuild() { - childSetCommitCallback("running", LLLiveLSLEditor::onRunningCheckboxClicked, this); - getChildView("running")->setEnabled(false); - - childSetAction("Reset",&LLLiveLSLEditor::onReset,this); - getChildView("Reset")->setEnabled(true); - - mMonoCheckbox = getChild<LLCheckBoxCtrl>("mono"); - childSetCommitCallback("mono", &LLLiveLSLEditor::onMonoCheckboxClicked, this); - getChildView("mono")->setEnabled(true); - - mScriptEd->mEditor->makePristine(); - mScriptEd->mEditor->setFocus(true); + mResetButton = getChild<LLButton>("Reset"); + mResetButton->setClickedCallback([&](LLUICtrl*, const LLSD&) { onReset(); }); + mRunningCheckbox = getChild<LLCheckBoxCtrl>("running"); + mRunningCheckbox->setCommitCallback([&](LLUICtrl*, const LLSD&) { onRunningCheckboxClicked(); }); mExperiences = getChild<LLComboBox>("Experiences..."); - mExperiences->setCommitCallback(boost::bind(&LLLiveLSLEditor::experienceChanged, this)); + mExperiences->setCommitCallback([&](LLUICtrl*, const LLSD&) { experienceChanged(); }); mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp"); + mExperienceEnabled->setCommitCallback([&](LLUICtrl*, const LLSD&) { onToggleExperience(); }); - childSetCommitCallback("enable_xp", onToggleExperience, this); - childSetCommitCallback("view_profile", onViewProfile, this); + mViewProfileButton = getChild<LLButton>("view_profile"); + mViewProfileButton->setClickedCallback([&](LLUICtrl*, const LLSD&) { onViewProfile(); }); + + mScriptEd->mEditor->makePristine(); + mScriptEd->mEditor->setFocus(true); + mScriptEd->mCompileTarget = getChild<LLComboBox>("compile_target"); + mScriptEd->mCompileTarget->setCommitCallback([&](LLUICtrl*, const LLSD&) { onCompileTargetChanged(); }); return LLPreview::postBuild(); } @@ -1995,7 +2229,16 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id, LL_DEBUGS() << "LSL Bytecode saved" << LL_ENDL; mScriptEd->mErrorList->setCommentText(LLTrans::getString("CompileSuccessful")); mScriptEd->mErrorList->setCommentText(LLTrans::getString("SaveComplete")); - getChild<LLCheckBoxCtrl>("running")->set(is_script_running); + + if (isOpenInExternalEditor()) + { + LLSD success_msg; + success_msg.append(LLTrans::getString("CompileSuccessful")); + success_msg.append(LLTrans::getString("SaveComplete")); + logErrorsToFile(success_msg); + } + + mRunningCheckbox->set(is_script_running); mIsSaving = false; closeIfNeeded(); } @@ -2004,6 +2247,7 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id, void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors) { LL_DEBUGS() << "Compile failed!" << LL_ENDL; + for(LLSD::array_const_iterator line = compile_errors.beginArray(); line < compile_errors.endArray(); line++) @@ -2016,6 +2260,12 @@ void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors) row["columns"][0]["font"] = "OCRA"; mScriptEd->mErrorList->addElement(row); } + + if (isOpenInExternalEditor()) + { + logErrorsToFile(compile_errors); + } + mScriptEd->selectFirstError(); mIsSaving = false; closeIfNeeded(); @@ -2058,9 +2308,10 @@ void LLLiveLSLEditor::loadAsset() { mItem = new LLViewerInventoryItem(item); // request the text from the object - LLSD* user_data = new LLSD(); - user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID); - gAssetStorage->getInvItemAsset(object->getRegion()->getHost(), + LLSD* user_data = new LLSD(); + user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID); + gAssetStorage->getInvItemAsset( + object->getRegion()->getHost(), gAgent.getID(), gAgent.getSessionID(), item->getPermissions().getOwner(), @@ -2068,8 +2319,8 @@ void LLLiveLSLEditor::loadAsset() item->getUUID(), item->getAssetUUID(), item->getType(), - &LLLiveLSLEditor::onLoadComplete, - (void*)user_data, + LLLiveLSLEditor::onLoadComplete, + user_data, true); LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_GetScriptRunning); @@ -2108,26 +2359,6 @@ void LLLiveLSLEditor::loadAsset() */ } } - else - { - mScriptEd->setScriptText(std::string(HELLO_LSL), true); - mScriptEd->enableSave(false); - LLPermissions perm; - perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, gAgent.getGroupID()); - perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, PERM_MOVE | PERM_TRANSFER); - mItem = new LLViewerInventoryItem(mItemUUID, - mObjectUUID, - perm, - LLUUID::null, - LLAssetType::AT_LSL_TEXT, - LLInventoryType::IT_LSL, - DEFAULT_SCRIPT_NAME, - DEFAULT_SCRIPT_DESC, - LLSaleInfo::DEFAULT, - LLInventoryItemFlags::II_FLAGS_NONE, - time_corrected()); - mAssetStatus = PREVIEW_ASSET_LOADED; - } requestExperiences(); } @@ -2200,17 +2431,35 @@ void LLLiveLSLEditor::loadScriptText(const LLUUID &uuid, LLAssetType::EType type script_name = inv_item->getName(); } mScriptEd->setScriptName(script_name); + + // Detect language from inventory metadata, with content-based fallback. + bool is_lua = false; + std::string compile_target; + if (inv_item) + { + U8 subtype = inv_item->getInventorySubType(); + std::string runtime = inv_item->getRuntime(); + is_lua = (subtype == SST_LUA); + if (!is_lua && (runtime == "luau")) + compile_target = "lsl-luau"; + else + compile_target = runtime; + } + if (compile_target.empty()) + { + if (!is_lua) + is_lua = is_lua_script(std::string(&buffer[0], file_length)); + compile_target = is_lua ? "luau" : "mono"; + } + mScriptEd->mCompileTarget->setValue(compile_target); + mScriptEd->mEditor->setLuauLanguage(is_lua); + mScriptEd->processKeywords(is_lua); } -void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata ) +void LLLiveLSLEditor::onRunningCheckboxClicked() { - LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata; - LLViewerObject* object = gObjectList.findObject( self->mObjectUUID ); - LLCheckBoxCtrl* runningCheckbox = self->getChild<LLCheckBoxCtrl>("running"); - bool running = runningCheckbox->get(); - //self->mRunningCheckbox->get(); - if( object ) + if (LLViewerObject* object = gObjectList.findObject(mObjectUUID)) { LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_SetScriptRunning); @@ -2218,24 +2467,21 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata ) msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_Script); - msg->addUUIDFast(_PREHASH_ObjectID, self->mObjectUUID); - msg->addUUIDFast(_PREHASH_ItemID, self->mItemUUID); - msg->addBOOLFast(_PREHASH_Running, running); + msg->addUUIDFast(_PREHASH_ObjectID, mObjectUUID); + msg->addUUIDFast(_PREHASH_ItemID, mItemUUID); + msg->addBOOLFast(_PREHASH_Running, mRunningCheckbox->get()); msg->sendReliable(object->getRegion()->getHost()); } else { - runningCheckbox->set(!running); + mRunningCheckbox->set(!mRunningCheckbox->get()); LLNotificationsUtil::add("CouldNotStartStopScript"); } } -void LLLiveLSLEditor::onReset(void *userdata) +void LLLiveLSLEditor::onReset() { - LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata; - - LLViewerObject* object = gObjectList.findObject( self->mObjectUUID ); - if(object) + if (LLViewerObject* object = gObjectList.findObject(mObjectUUID)) { LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_ScriptReset); @@ -2243,8 +2489,8 @@ void LLLiveLSLEditor::onReset(void *userdata) msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_Script); - msg->addUUIDFast(_PREHASH_ObjectID, self->mObjectUUID); - msg->addUUIDFast(_PREHASH_ItemID, self->mItemUUID); + msg->addUUIDFast(_PREHASH_ObjectID, mObjectUUID); + msg->addUUIDFast(_PREHASH_ItemID, mItemUUID); msg->sendReliable(object->getRegion()->getHost()); } else @@ -2256,34 +2502,33 @@ void LLLiveLSLEditor::onReset(void *userdata) void LLLiveLSLEditor::draw() { LLViewerObject* object = gObjectList.findObject(mObjectUUID); - LLCheckBoxCtrl* runningCheckbox = getChild<LLCheckBoxCtrl>( "running"); - if(object && mAskedForRunningInfo && mHaveRunningInfo) + if (object && mAskedForRunningInfo && mHaveRunningInfo) { - if(object->permAnyOwner()) + if (object->permAnyOwner()) { - runningCheckbox->setLabel(getString("script_running")); - runningCheckbox->setEnabled(!mIsSaving); + mRunningCheckbox->setLabel(getString("script_running")); + mRunningCheckbox->setEnabled(!mIsSaving); } else { - runningCheckbox->setLabel(getString("public_objects_can_not_run")); - runningCheckbox->setEnabled(false); + mRunningCheckbox->setLabel(getString("public_objects_can_not_run")); + mRunningCheckbox->setEnabled(false); // *FIX: Set it to false so that the ui is correct for // a box that is released to public. It could be // incorrect after a release/claim cycle, but will be // correct after clicking on it. - runningCheckbox->set(false); - mMonoCheckbox->set(false); + mRunningCheckbox->set(false); + mScriptEd->mCompileTarget->clear(); } } - else if(!object) + else if (!object) { // HACK: Display this information in the title bar. // Really ought to put in main window. setTitle(LLTrans::getString("ObjectOutOfRange")); - runningCheckbox->setEnabled(false); - mMonoCheckbox->setEnabled(false); + mRunningCheckbox->setEnabled(false); + mScriptEd->mCompileTarget->setEnabled(false); // object may have fallen out of range. mHaveRunningInfo = false; } @@ -2340,6 +2585,8 @@ void LLLiveLSLEditor::finishLSLUpload(LLUUID itemId, LLUUID taskId, LLUUID newAs { preview->callbackLSLCompileFailed(response["errors"]); } + response["is_running"] = isRunning; + preview->sendCompileResults(response); } } @@ -2390,7 +2637,7 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/) mScriptEd->sync(); } - bool isRunning = getChild<LLCheckBoxCtrl>("running")->get(); + bool is_running = mRunningCheckbox->get(); getWindow()->incBusyCount(); mPendingUploads++; @@ -2398,17 +2645,18 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/) if (!url.empty()) { + std::string compile_target(mScriptEd->mCompileTarget->getValue()); std::string buffer(mScriptEd->mEditor->getText()); LLUUID old_asset_id = mScriptEd->getAssetID(); LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLScriptAssetUpload>(mObjectUUID, mItemUUID, - monoChecked() ? LLScriptAssetUpload::MONO : LLScriptAssetUpload::LSL2, - isRunning, mScriptEd->getAssociatedExperience(), buffer, - [isRunning, old_asset_id](LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response) { - LLFileSystem::removeFile(old_asset_id, LLAssetType::AT_LSL_TEXT); - LLLiveLSLEditor::finishLSLUpload(itemId, taskId, newAssetId, response, isRunning); - }, - nullptr)); // needs failure handling? + compile_target, is_running, mScriptEd->getAssociatedExperience(), buffer, + [is_running, old_asset_id](LLUUID item_id, LLUUID task_id, LLUUID new_asset_id, LLSD response) + { + LLFileSystem::removeFile(old_asset_id, LLAssetType::AT_LSL_TEXT); + LLLiveLSLEditor::finishLSLUpload(item_id, task_id, new_asset_id, response, is_running); + }, + nullptr)); // needs failure handling? LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo); } @@ -2461,28 +2709,61 @@ void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**) if (LLLiveLSLEditor* instance = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key)) { instance->mHaveRunningInfo = true; + bool running; msg->getBOOLFast(_PREHASH_Script, _PREHASH_Running, running); - LLCheckBoxCtrl* runningCheckbox = instance->getChild<LLCheckBoxCtrl>("running"); - runningCheckbox->set(running); - bool mono; - msg->getBOOLFast(_PREHASH_Script, "Mono", mono); - LLCheckBoxCtrl* monoCheckbox = instance->getChild<LLCheckBoxCtrl>("mono"); - monoCheckbox->setEnabled(instance->getIsModifiable() && have_script_upload_cap(object_id)); - monoCheckbox->set(mono); - } -} + instance->mRunningCheckbox->set(running); -void LLLiveLSLEditor::onMonoCheckboxClicked(LLUICtrl*, void* userdata) -{ - LLLiveLSLEditor* self = static_cast<LLLiveLSLEditor*>(userdata); - self->mMonoCheckbox->setEnabled(have_script_upload_cap(self->mObjectUUID)); - self->mScriptEd->enableSave(self->getIsModifiable()); + bool mono = false, luau = false, luau_language = false; + msg->getBOOLFast(_PREHASH_Script, _PREHASH_Mono, mono); + msg->getBOOLFast(_PREHASH_Script, _PREHASH_Luau, luau); // Luau compiler is enabled + msg->getBOOLFast(_PREHASH_Script, _PREHASH_LuauLanguage, luau_language); + + std::string compile_target; + if (luau) + { + if (luau_language) + { + compile_target = "luau"; + } + else + { + compile_target = "lsl-luau"; // Luau compiler running in LSL compatibility mode + } + } + else if (mono) + { + compile_target = "mono"; + } + else + { + compile_target = "lsl2"; + } + + instance->mScriptEd->mCompileTarget->setValue(compile_target); + instance->mScriptEd->processKeywords(luau && luau_language); // Use Luau syntax highlighting for Luau scripts + + bool lua_scripts_enabled = have_lua_enabled(object_id); + if (LLScrollListItem* luau_item = instance->mScriptEd->mCompileTarget->findItemByValue("luau")) + { + luau_item->setEnabled(lua_scripts_enabled); + } + if (LLScrollListItem* lsl_luau_item = instance->mScriptEd->mCompileTarget->findItemByValue("lsl-luau")) + { + lsl_luau_item->setEnabled(lua_scripts_enabled); + } + + instance->mScriptEd->mCompileTarget->setEnabled(instance->getIsModifiable() && have_script_upload_cap(object_id)); + } } -bool LLLiveLSLEditor::monoChecked() const +void LLLiveLSLEditor::onCompileTargetChanged() { - return mMonoCheckbox && mMonoCheckbox->getValue(); + mScriptEd->mCompileTarget->setEnabled(have_script_upload_cap(mObjectUUID)); + mScriptEd->enableSave(getIsModifiable()); + bool is_lua = mScriptEd->mCompileTarget->getValue().asString() == "luau"; + mScriptEd->mEditor->setLuauLanguage(is_lua); + mScriptEd->processKeywords(is_lua); } void LLLiveLSLEditor::setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience ) diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a56697117a..909e2183c2 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -24,8 +24,7 @@ * $/LicenseInfo$ */ -#ifndef LL_LLPREVIEWSCRIPT_H -#define LL_LLPREVIEWSCRIPT_H +#pragma once #include "llpreview.h" #include "lltabcontainer.h" @@ -54,6 +53,9 @@ class LLScriptEdContainer; class LLFloaterGotoLine; class LLFloaterExperienceProfile; class LLScriptMovedObserver; +class LLScriptEditorWSServer; + +bool is_lua_script(const std::string& code); class LLLiveLSLFile : public LLLiveFile { @@ -61,12 +63,12 @@ public: typedef std::function<bool(const std::string& filename)> change_callback_t; LLLiveLSLFile(std::string file_path, change_callback_t change_cb); - ~LLLiveLSLFile(); + ~LLLiveLSLFile() override; void ignoreNextUpdate() { mIgnoreNextUpdate = true; } protected: - /*virtual*/ bool loadFile(); + bool loadFile() override; change_callback_t mOnChangeCallback; bool mIgnoreNextUpdate; @@ -82,26 +84,34 @@ class LLScriptEdCore : public LLPanel friend class LLScriptEdContainer; friend class LLFloaterGotoLine; +public: + typedef boost::function<void(void*)> script_ed_callback_t; + typedef boost::function<void(void*, bool)> save_callback_t; + protected: // Supposed to be invoked only by the container. LLScriptEdCore( LLScriptEdContainer* container, const std::string& sample, const LLHandle<LLFloater>& floater_handle, - void (*load_callback)(void* userdata), - void (*save_callback)(void* userdata, bool close_after_save), - void (*search_replace_callback)(void* userdata), + script_ed_callback_t load_callback, + save_callback_t save_callback, + script_ed_callback_t search_replace_callback, void* userdata, bool live, S32 bottom_pad = 0); // pad below bottom row of buttons public: - ~LLScriptEdCore(); + ~LLScriptEdCore() override; void initMenu(); void processKeywords(); + void processKeywords(bool luau_language); + LLScriptEditor* getEditor() const { return mEditor; } + LLKeywords& getKeywords() const { return mEditor->getKeywords(); } + bool isLuauLanguage() const { return mEditor->getIsLuauLanguage(); } - virtual void draw(); - /*virtual*/ bool postBuild(); + void draw() override; + bool postBuild() override; bool canClose(); void setEnableEditing(bool enable); bool canLoadOrSaveToFile( void* userdata ); @@ -134,33 +144,32 @@ public: static bool enableSaveToFileMenu(void* userdata); static bool enableLoadFromFileMenu(void* userdata); - virtual bool hasAccelerators() const { return true; } + bool hasAccelerators() const override { return true; } LLUUID getAssociatedExperience()const; void setAssociatedExperience( const LLUUID& experience_id ); - void setScriptName(const std::string& name){mScriptName = name;}; + void setScriptName(const std::string& name) { mScriptName = name; } - void setItemRemoved(bool script_removed){mScriptRemoved = script_removed;}; + void setItemRemoved(bool script_removed) { mScriptRemoved = script_removed; } void setAssetID( const LLUUID& asset_id){ mAssetID = asset_id; }; LLUUID getAssetID() const { return mAssetID; } - bool isFontSizeChecked(const LLSD &userdata); - void onChangeFontSize(const LLSD &size_name); + bool isFontSizeChecked(const LLSD &userdata); + void onChangeFontSize(const LLSD &size_name); - virtual bool handleKeyHere(KEY key, MASK mask); - void selectAll() { mEditor->selectAll(); } + bool handleKeyHere(KEY key, MASK mask) override; + void selectAll() { mEditor->selectAll(); } + + void enableSave(bool b) { mEnableSave = b; } + bool hasChanged() const; private: void onBtnDynamicHelp(); void onBtnUndoChanges(); - bool hasChanged() const; - void selectFirstError(); - void enableSave(bool b) {mEnableSave = b;} - protected: void deleteBridges(); void setHelpPage(const std::string& help_string); @@ -175,9 +184,9 @@ private: std::string mSampleText; std::string mScriptName; LLScriptEditor* mEditor; - void (*mLoadCallback)(void* userdata); - void (*mSaveCallback)(void* userdata, bool close_after_save); - void (*mSearchReplaceCallback) (void* userdata); + script_ed_callback_t mLoadCallback; + save_callback_t mSaveCallback; + script_ed_callback_t mSearchReplaceCallback; void* mUserdata; LLComboBox *mFunctions; bool mForceClose; @@ -190,19 +199,18 @@ private: S32 mLiveHelpHistorySize; bool mEnableSave; bool mHasScriptData; - LLLiveLSLFile* mLiveFile; LLUUID mAssociatedExperience; bool mScriptRemoved; bool mSaveDialogShown; LLUUID mAssetID; LLTextBox* mLineCol = nullptr; LLButton* mSaveBtn = nullptr; + LLComboBox* mCompileTarget = nullptr; LLScriptEdContainer* mContainer; // parent view -public: + public: boost::signals2::connection mSyntaxIDConnection; - }; class LLScriptEdContainer : public LLPreview @@ -211,15 +219,30 @@ class LLScriptEdContainer : public LLPreview public: LLScriptEdContainer(const LLSD& key); + ~LLScriptEdContainer() override; + + bool handleKeyHere(KEY key, MASK mask) override; - bool handleKeyHere(KEY key, MASK mask); + void startWebsocketServer(); + void unsubscribeScript(); + void sendCompileResults(LLSD&); + + LLScriptEdCore* getScriptEdCore() const { return mScriptEd; } protected: - std::string getTmpFileName(const std::string& script_name); + std::string getTmpFileName(const std::string& script_name) const; + std::string getUniqueHash() const; + std::string getErrorLogFileName(const std::string& script_path); bool onExternalChange(const std::string& filename); virtual void saveIfNeeded(bool sync = true) = 0; + bool logErrorsToFile(const LLSD& compile_errors); + bool isOpenInExternalEditor() const { return mLiveFile != nullptr; } LLScriptEdCore* mScriptEd; + LLLiveLSLFile* mLiveFile = nullptr; + LLLiveLSLFile* mLiveLogFile = nullptr; + + std::weak_ptr<LLScriptEditorWSServer> mWebSocketServer; }; // Used to view and edit an LSL script from your inventory. @@ -227,7 +250,7 @@ class LLPreviewLSL : public LLScriptEdContainer { public: LLPreviewLSL(const LLSD& key ); - ~LLPreviewLSL(); + ~LLPreviewLSL() override; LLUUID getScriptID() { return mItemUUID; } @@ -236,15 +259,16 @@ public: virtual void callbackLSLCompileSucceeded(); virtual void callbackLSLCompileFailed(const LLSD& compile_errors); - /*virtual*/ bool postBuild(); + bool postBuild() override; protected: - virtual void draw(); - virtual bool canClose(); + void draw() override; + bool canClose() override; void closeIfNeeded(); - virtual void loadAsset(); - /*virtual*/ void saveIfNeeded(bool sync = true); + void loadAsset() override; + void saveIfNeeded(bool sync = true) override; + void onCompileTargetChanged(); static void onSearchReplace(void* userdata); static void onLoad(void* userdata); @@ -265,10 +289,8 @@ protected: S32 mPendingUploads; LLScriptMovedObserver* mItemObserver; - }; - // Used to view and edit an LSL script that is attached to an object. class LLLiveLSLEditor : public LLScriptEdContainer { @@ -276,7 +298,6 @@ class LLLiveLSLEditor : public LLScriptEdContainer public: LLLiveLSLEditor(const LLSD& key); - static void processScriptRunningReply(LLMessageSystem* msg, void**); virtual void callbackLSLCompileSucceeded(const LLUUID& task_id, @@ -284,13 +305,13 @@ public: bool is_script_running); virtual void callbackLSLCompileFailed(const LLSD& compile_errors); - /*virtual*/ bool postBuild(); + bool postBuild() override; void setIsNew() { mIsNew = true; } static void setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience ); - static void onToggleExperience(LLUICtrl *ui, void* userdata); - static void onViewProfile(LLUICtrl *ui, void* userdata); + void onToggleExperience(); + void onViewProfile(); void setExperienceIds(const LLSD& experience_ids); void buildExperienceList(); @@ -300,15 +321,15 @@ public: void setObjectName(std::string name) { mObjectName = name; } + bool getIsModifiable() const { return mIsModifiable; } // Evaluated on load assert + private: - virtual bool canClose(); + bool canClose() override; void closeIfNeeded(); - virtual void draw(); - - virtual void loadAsset(); - /*virtual*/ void saveIfNeeded(bool sync = true); - bool monoChecked() const; + void draw() override; + void loadAsset() override; + void saveIfNeeded(bool sync = true) override; static void onSearchReplace(void* userdata); static void onLoad(void* userdata); @@ -317,14 +338,14 @@ private: static void onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); - static void onRunningCheckboxClicked(LLUICtrl*, void* userdata); - static void onReset(void* userdata); + void onRunningCheckboxClicked(); + void onReset(); void loadScriptText(const LLUUID &uuid, LLAssetType::EType type); static void* createScriptEdPanel(void* userdata); - static void onMonoCheckboxClicked(LLUICtrl*, void* userdata); + void onCompileTargetChanged(); static void finishLSLUpload(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response, bool isRunning); static void receiveExperienceIds(LLSD result, LLHandle<LLLiveLSLEditor> parent); @@ -342,19 +363,16 @@ private: S32 mPendingUploads; bool mIsSaving; + bool mIsModifiable; - bool getIsModifiable() const { return mIsModifiable; } // Evaluated on load assert - - LLCheckBoxCtrl* mMonoCheckbox; - bool mIsModifiable; - - - LLComboBox* mExperiences; - LLCheckBoxCtrl* mExperienceEnabled; - LLSD mExperienceIds; + LLButton* mResetButton { nullptr }; + LLCheckBoxCtrl* mRunningCheckbox { nullptr }; + LLComboBox* mExperiences { nullptr }; + LLCheckBoxCtrl* mExperienceEnabled { nullptr }; + LLButton* mViewProfileButton { nullptr }; + LLSD mExperienceIds; LLHandle<LLFloater> mExperienceProfile; - std::string mObjectName; + std::string mObjectName; }; -#endif // LL_LLPREVIEWSCRIPT_H diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 800fc7ec0c..e886957049 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -300,7 +300,8 @@ void LLPreviewTexture::saveAs() if( mLoadingFullImage ) return; - std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null; + // startPicker will sanitize the name + std::string filename = getItem() ? getItem()->getName() : LLStringUtil::null; LLFilePickerReplyThread::startPicker(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename); } diff --git a/indra/newview/llpublishedobjectmgr.cpp b/indra/newview/llpublishedobjectmgr.cpp new file mode 100644 index 0000000000..d92bb382de --- /dev/null +++ b/indra/newview/llpublishedobjectmgr.cpp @@ -0,0 +1,1309 @@ +/** + * @file llpublishedobjectmgr.cpp + * @brief Published object state/logic manager extracted from llscripteditorws + * + * $LicenseInfo:firstyear=2026&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2026, 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 "llpublishedobjectmgr.h" + +#include "llscripteditorws.h" + +#include "llchat.h" +#include "llinventorydefines.h" +#include "llregex.h" +#include "llselectmgr.h" +#include "llviewerinventory.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llvoinventorylistener.h" + +namespace +{ + static const boost::regex LUAU_LOCATION_PATTERN( + R"(^([^:]*):([0-9]+):\s*(.*)$)"); + + static const boost::regex LSL_LOCATION_PATTERN( + R"(\((\d+), (\d+)\) : ([^:]+) : (.+))"); + + std::string nv_string(LLViewerObject* obj, const char* key) + { + if (!obj) + { + return std::string(); + } + LLNameValue* nv = obj->getNVPair(key); + if (!nv) + { + return std::string(); + } + const char* s = nv->getString(); + if (!s || s[0] == '\0') + { + return std::string(); + } + return std::string(s); + } + + std::string get_prim_name(LLViewerObject* obj) + { + std::string name = nv_string(obj, "Name"); + if (!name.empty()) + { + return name; + } + + if (!obj) + { + return std::string(); + } + + LLSelectNode* node = LLSelectMgr::instance().getSelection()->findNode(obj); + if (node && !node->mName.empty()) + { + return node->mName; + } + + // Never emit an empty prim/object name to downstream tooling. + return obj->getID().asString(); + } +} + +class LLPublishedPrimListener : public LLVOInventoryListener +{ +public: + LLPublishedPrimListener(LLScriptEditorWSServer* server, const LLUUID& object_id, const LLUUID& prim_id, + LLViewerObject* object) + : mServer(server) + , mObjectID(object_id) + , mPrimID(prim_id) + { + registerVOInventoryListener(object, nullptr); + } + + ~LLPublishedPrimListener() override = default; + + void inventoryChanged(LLViewerObject* object, + LLInventoryObject::object_list_t* inventory, + S32 serial_num, void* user_data) override + { + if (mServer) + { + if (mServer->isObjectPublished(mObjectID)) + { + mServer->onPrimInventoryChanged(mObjectID, mPrimID); + } + else + { + mServer->onPrimInventoryReady(mObjectID, mPrimID); + } + } + } + + const LLUUID& getObjectID() const { return mObjectID; } + const LLUUID& getPrimID() const { return mPrimID; } + +private: + LLScriptEditorWSServer* mServer; + LLUUID mObjectID; + LLUUID mPrimID; +}; + +LLPublishedObjectMgr::LLPublishedObjectMgr( + LLScriptEditorWSServer* server, + RuntimeEventCallback runtime_event_callback): + mServer(server), + mRuntimeEventCallback(std::move(runtime_event_callback)), + mRuntimeEventAggregator(std::make_unique<RuntimeEventAggregator>( + [this](const RuntimeEventAggregator::RuntimeEvent& runtime_event) + { + std::optional<RuntimeChatEvent> event = + buildRuntimeChatEvent(runtime_event); + if (event && mRuntimeEventCallback) + { + mRuntimeEventCallback(*event); + } + })), + mRuntimeFlushTimer( + std::unique_ptr<LLEventTimer>( + LLEventTimer::run_every( + RUNTIME_FLUSH_INTERVAL, + [this]() + { + flushExpiredRuntimeFragments(); + }))) +{ +} + +LLPublishedObjectMgr::~LLPublishedObjectMgr() = default; + +void LLPublishedObjectMgr::ingestRuntimeChat( + const LLChat& chat_msg, + RuntimeEventAggregator::Channel channel) +{ + static const boost::regex runtime_error_header( + R"(^(.+?)\s+\[script:([^\]]+)\]\s+Script run-time error)"); + + std::vector<std::string> lines = + LLStringUtil::getTokens(chat_msg.mText, "\n"); + boost::smatch match; + bool is_error_header = + !lines.empty() && + boost::regex_match(lines.front(), match, runtime_error_header); + + if (!is_error_header && !mRuntimeEventAggregator->hasPending()) + { + RuntimeEventAggregator::RuntimeEvent runtime_event; + runtime_event.mVM = RuntimeEventAggregator::VM::LSL2; + runtime_event.mChannel = channel; + + RuntimeEventAggregator::Fragment fragment; + fragment.mFromID = chat_msg.mFromID; + fragment.mFromName = chat_msg.mFromName; + fragment.mText = chat_msg.mText; + runtime_event.mFragments.push_back(std::move(fragment)); + + std::optional<RuntimeChatEvent> event = + buildRuntimeChatEvent(runtime_event); + if (event && mRuntimeEventCallback) + { + mRuntimeEventCallback(*event); + } + return; + } + + RuntimeEventAggregator::VM vm = RuntimeEventAggregator::VM::LSL2; + LLViewerObject* prim = gObjectList.findObject(chat_msg.mFromID); + if (prim) + { + std::vector<std::string> lines = + LLStringUtil::getTokens(chat_msg.mText, "\n"); + static const boost::regex runtime_error_header( + R"(^(.+?)\s+\[script:([^\]]+)\]\s+Script run-time error)"); + boost::smatch match; + + if (!lines.empty() && + boost::regex_match(lines.front(), match, runtime_error_header)) + { + const std::string script_name = match[2].str(); + LLInventoryObject::object_list_t inventory; + prim->getInventoryContents(inventory); + for (const auto& inventory_object : inventory) + { + LLInventoryItem* item = + dynamic_cast<LLInventoryItem*>(inventory_object.get()); + if (item && item->getName() == script_name && + item->getRuntime() == "luau") + { + vm = RuntimeEventAggregator::VM::LUAU; + break; + } + } + } + } + + mRuntimeEventAggregator->ingest( + chat_msg.mFromID, + chat_msg.mFromName, + chat_msg.mText, + vm, + channel); +} + +void LLPublishedObjectMgr::flushExpiredRuntimeFragments() +{ + mRuntimeEventAggregator->flushExpired(); +} + +std::optional<LLPublishedObjectMgr::RuntimeChatEvent> +LLPublishedObjectMgr::buildRuntimeChatEvent( + const RuntimeEventAggregator::RuntimeEvent& runtime_event) const +{ + if (runtime_event.mFragments.empty()) + { + return std::nullopt; + } + + const RuntimeEventAggregator::Fragment& source = + runtime_event.mFragments.front(); + LLViewerObject* prim = gObjectList.findObject(source.mFromID); + if (!prim) + { + return std::nullopt; + } + + LLViewerObject* root = prim->getRootEdit(); + if (!root) + { + return std::nullopt; + } + + RuntimeChatEvent event; + event.mChannel = runtime_event.mChannel; + event.mVM = runtime_event.mVM; + event.mRootID = root->getID(); + event.mPrimID = prim->getID(); + event.mObjectName = source.mFromName; + for (const auto& fragment : runtime_event.mFragments) + { + if (!event.mMessage.empty()) + { + event.mMessage += "\n"; + } + event.mMessage += fragment.mText; + } + + std::vector<std::string> lines = + LLStringUtil::getTokens(event.mMessage, "\n"); + static const std::string runtime_error_marker = "Script run-time error"; + static const boost::regex runtime_error_header( + R"(^(.+?)\s+\[script:([^\]]+)\]\s+Script run-time error)"); + + auto ends_with = [](const std::string& value, const std::string& suffix) + { + return value.size() >= suffix.size() && + std::equal(suffix.rbegin(), suffix.rend(), value.rbegin()); + }; + + if (!lines.empty() && ends_with(lines.front(), runtime_error_marker)) + { + event.mIsError = true; + boost::smatch match; + if (boost::regex_match(lines.front(), match, runtime_error_header)) + { + event.mObjectName = match[1].str(); + event.mScriptName = match[2].str(); + lines.erase(lines.begin()); + } + else + { + lines.clear(); + } + } + + LLInventoryObject::object_list_t inventory; + prim->getInventoryContents(inventory); + for (const auto& inventory_object : inventory) + { + LLInventoryItem* item = + dynamic_cast<LLInventoryItem*>(inventory_object.get()); + if (item && !event.mScriptName.empty() && + item->getName() == event.mScriptName) + { + event.mItemID = item->getUUID(); + break; + } + } + + if (event.mIsError && !lines.empty()) + { + RuntimeEventAggregator::VM vm = runtime_event.mVM; + if (event.mItemID.notNull()) + { + LLInventoryItem* item = + dynamic_cast<LLInventoryItem*>(prim->getInventoryObject(event.mItemID)); + if (item && item->getRuntime() == "luau") + { + vm = RuntimeEventAggregator::VM::LUAU; + } + } + + RuntimeEventAggregator::ParsedError parsed = + mRuntimeEventAggregator->parseError(vm, runtime_event.mFragments); + event.mError = parsed.mError; + event.mLine = parsed.mLine; + event.mColumn = parsed.mColumn; + event.mStack = lines; + } + + return event; +} + +LLPublishedObjectMgr::RuntimeEventAggregator::RuntimeEventAggregator( + FlushCallback flush_callback): + mFlushCallback(std::move(flush_callback)) +{ +} + +void LLPublishedObjectMgr::RuntimeEventAggregator::ingest( + const LLUUID& from_id, + const std::string& from_name, + const std::string& text, + VM vm, + Channel channel) +{ + if (mPending && + isNewBurst(from_id, from_name, vm, channel)) + { + flushPending(); + } + + if (!mPending) + { + mPending = std::make_unique<PendingBurst>(); + mPending->mFromID = from_id; + mPending->mFromName = from_name; + mPending->mVM = vm; + mPending->mChannel = channel; + } + + Fragment fragment; + fragment.mFromID = from_id; + fragment.mFromName = from_name; + fragment.mText = text; + mPending->mFragments.push_back(std::move(fragment)); + mPending->mTimer.setTimerExpirySec(FRAGMENT_TIMEOUT); +} + +void LLPublishedObjectMgr::RuntimeEventAggregator::flushExpired() +{ + if (mPending && mPending->mTimer.hasExpired()) + { + flushPending(); + } +} + +void LLPublishedObjectMgr::RuntimeEventAggregator::flush() +{ + flushPending(); +} + +bool LLPublishedObjectMgr::RuntimeEventAggregator::hasPending() const +{ + return mPending != nullptr; +} + +LLPublishedObjectMgr::RuntimeEventAggregator::ParsedError +LLPublishedObjectMgr::RuntimeEventAggregator::parseError( + VM vm, + const fragments_t& fragments) const +{ + ParsedError parsed; + const boost::regex* location_pattern = nullptr; + bool lsl_coordinates = false; + + switch (vm) + { + case VM::LUAU: + location_pattern = &LUAU_LOCATION_PATTERN; + break; + case VM::LSL2: + location_pattern = &LSL_LOCATION_PATTERN; + lsl_coordinates = true; + break; + } + + for (const auto& fragment : fragments) + { + std::vector<std::string> lines = + LLStringUtil::getTokens(fragment.mText, "\n"); + for (const auto& line : lines) + { + boost::smatch match; + if (!boost::regex_match(line, match, *location_pattern)) + { + continue; + } + + if (lsl_coordinates) + { + parsed.mLine = static_cast<S32>( + std::strtol(match[1].str().c_str(), nullptr, 10)) + 1; + parsed.mColumn = static_cast<S32>( + std::strtol(match[2].str().c_str(), nullptr, 10)) + 1; + parsed.mError = match[4].str(); + } + else + { + parsed.mSource = match[1].str(); + parsed.mLine = static_cast<S32>( + std::strtol(match[2].str().c_str(), nullptr, 10)); + parsed.mColumn = 0; + parsed.mError = match[3].str(); + } + return parsed; + } + } + + // LSL runtime errors commonly arrive as plain text without source + // location metadata, for example: "Math Error". + if (vm == VM::LSL2) + { + for (const auto& fragment : fragments) + { + const std::vector<std::string> lines = + LLStringUtil::getTokens(fragment.mText, "\n"); + for (const auto& line : lines) + { + if (line.empty() || + line.find("Script run-time error") != std::string::npos) + { + continue; + } + + parsed.mError = line; + return parsed; + } + } + } + + return parsed; +} + +void LLPublishedObjectMgr::RuntimeEventAggregator::flushPending() +{ + if (!mPending) + { + return; + } + + if (!mFlushCallback) + { + mPending.reset(); + return; + } + + RuntimeEvent event; + event.mVM = mPending->mVM; + event.mChannel = mPending->mChannel; + event.mFragments = mPending->mFragments; + event.mError = parseError(mPending->mVM, mPending->mFragments); + mFlushCallback(event); + + mPending.reset(); +} + +bool LLPublishedObjectMgr::RuntimeEventAggregator::isNewBurst( + const LLUUID& from_id, + const std::string& from_name, + VM vm, + Channel channel) const +{ + return mPending->mFromID != from_id || + mPending->mFromName != from_name || + mPending->mVM != vm || + mPending->mChannel != channel; +} + +LLPublishedObjectMgr::PublishedObjectInfo::PublishedObjectInfo() = default; +LLPublishedObjectMgr::PublishedObjectInfo::~PublishedObjectInfo() = default; +LLPublishedObjectMgr::PublishedObjectInfo::PublishedObjectInfo(PublishedObjectInfo&&) noexcept = default; +LLPublishedObjectMgr::PublishedObjectInfo& LLPublishedObjectMgr::PublishedObjectInfo::operator=(PublishedObjectInfo&&) noexcept = default; + +LLPublishedObjectMgr::PendingPublish::PendingPublish() = default; +LLPublishedObjectMgr::PendingPublish::~PendingPublish() = default; +LLPublishedObjectMgr::PendingPublish::PendingPublish(PendingPublish&&) noexcept = default; +LLPublishedObjectMgr::PendingPublish& LLPublishedObjectMgr::PendingPublish::operator=(PendingPublish&&) noexcept = default; + +void LLPublishedObjectMgr::beginPendingPublish(const LLUUID& object_id, const std::vector<LLViewerObject*>& prims) +{ + PendingPublish pending; + pending.mObjectID = object_id; + for (LLViewerObject* prim : prims) + { + pending.mPendingPrims.insert(prim->getID()); + auto listener = std::make_unique<LLPublishedPrimListener>( + mServer, object_id, prim->getID(), prim); + pending.mListeners.push_back(std::move(listener)); + } + mPendingPublishes[object_id] = std::move(pending); +} + +bool LLPublishedObjectMgr::hasPendingPublish(const LLUUID& object_id) const +{ + return mPendingPublishes.find(object_id) != mPendingPublishes.end(); +} + +bool LLPublishedObjectMgr::markPendingPublishPrimReady(const LLUUID& object_id, const LLUUID& prim_id) +{ + auto it = mPendingPublishes.find(object_id); + if (it == mPendingPublishes.end()) + { + return false; + } + + it->second.mPendingPrims.erase(prim_id); + return it->second.mPendingPrims.empty(); +} + +void LLPublishedObjectMgr::recordPendingPropertyChange( + const LLUUID& root_id, + const LLUUID& prim_id, + const std::string& name, + const std::string& desc) +{ + auto it = mPendingPublishes.find(root_id); + if (it == mPendingPublishes.end()) + { + return; + } + + PendingPublish& pending = it->second; + if (prim_id == root_id) + { + pending.mHasRootProperties = true; + pending.mObjectDescription = desc; + if (!name.empty()) + { + pending.mObjectName = name; + } + return; + } + + if (!name.empty()) + { + pending.mPrimNames[prim_id] = name; + } + pending.mPrimDescriptions[prim_id] = desc; +} + +std::vector<std::unique_ptr<LLPublishedPrimListener>> LLPublishedObjectMgr::takePendingPublishListeners(const LLUUID& object_id) +{ + auto it = mPendingPublishes.find(object_id); + if (it == mPendingPublishes.end()) + { + return {}; + } + + auto listeners = std::move(it->second.mListeners); + mPendingPublishes.erase(it); + return listeners; +} + +void LLPublishedObjectMgr::cancelPendingPublish(const LLUUID& object_id) +{ + mPendingPublishes.erase(object_id); +} + +void LLPublishedObjectMgr::cancelPendingPublishWithCleanup(const LLUUID& object_id) +{ + auto it = mPendingPublishes.find(object_id); + if (it == mPendingPublishes.end()) + { + return; + } + + it->second.mListeners.clear(); + mPendingPublishes.erase(it); +} + +LLPublishedObjectMgr::PublishedObjectInfo* LLPublishedObjectMgr::getPublished(const LLUUID& object_id) +{ + auto it = mPublishedObjects.find(object_id); + if (it == mPublishedObjects.end()) + { + return nullptr; + } + + return &it->second; +} + +const LLPublishedObjectMgr::PublishedObjectInfo* LLPublishedObjectMgr::getPublished(const LLUUID& object_id) const +{ + auto it = mPublishedObjects.find(object_id); + if (it == mPublishedObjects.end()) + { + return nullptr; + } + + return &it->second; +} + +bool LLPublishedObjectMgr::reservePendingItemCreate(const LLUUID& prim_id, std::string&& pump_name) +{ + auto it = mPendingItemCreates.find(prim_id); + if (it != mPendingItemCreates.end()) + { + return false; + } + + mPendingItemCreates[prim_id] = std::move(pump_name); + return true; +} + +bool LLPublishedObjectMgr::consumePendingItemCreate(const LLUUID& prim_id, std::string& pump_name) +{ + auto it = mPendingItemCreates.find(prim_id); + if (it == mPendingItemCreates.end()) + { + return false; + } + + pump_name = it->second; + mPendingItemCreates.erase(it); + return true; +} + +void LLPublishedObjectMgr::clearPendingItemCreate(const LLUUID& prim_id) +{ + mPendingItemCreates.erase(prim_id); +} + +LLSD LLPublishedObjectMgr::buildPrimInventoryLLSD(LLViewerObject* object) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLSD items = LLSD::emptyArray(); + if (!object) + { + return items; + } + + LLInventoryObject::object_list_t contents; + object->getInventoryContents(contents); + + for (const auto& obj : contents) + { + LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(obj.get()); + if (!item) + { + continue; + } + + LLAssetType::EType type = item->getType(); + if (type != LLAssetType::AT_LSL_TEXT && type != LLAssetType::AT_NOTECARD) + { + continue; + } + + LLSD entry; + entry["item_id"] = item->getUUID(); + entry["name"] = item->getName(); + entry["description"] = item->getDescription(); + entry["type"] = (type == LLAssetType::AT_LSL_TEXT) ? "script" : "notecard"; + + if (type == LLAssetType::AT_LSL_TEXT) + { + U8 subtype = item->getInventorySubType(); + entry["subtype"] = static_cast<S32>(subtype); + + const std::string& runtime = item->getRuntime(); + if (!runtime.empty()) + { + entry["vm"] = runtime; + } + + LLViewerInventoryItem* viewer_item = dynamic_cast<LLViewerInventoryItem*>(item); + if (viewer_item) + { + entry["running"] = viewer_item->getIsRunning(); + entry["faulted"] = viewer_item->getIsFaulted(); + } + } + + const LLPermissions& perms = item->getPermissions(); + LLSD perm_entry; + perm_entry["owner"] = static_cast<S32>(perms.getMaskOwner()); + perm_entry["next_owner"] = static_cast<S32>(perms.getMaskNextOwner()); + entry["permissions"] = perm_entry; + + entry["creator_id"] = perms.getCreator(); + + items.append(entry); + } + + return items; +} + +LLSD LLPublishedObjectMgr::buildPublishedObjectLLSD(LLViewerObject* root) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLSD pub; + pub["object_id"] = root->getID(); + pub["object_name"] = get_prim_name(root); + pub["object_description"] = nv_string(root, "Desc"); + pub["owner_id"] = root->mOwnerID; + if (root->getRegion()) + { + pub["region"] = root->getRegion()->getName(); + } + pub["inventory"] = buildPrimInventoryLLSD(root); + + LLSD linked_objects = LLSD::emptyArray(); + S32 link_number = 2; + for (LLViewerObject* child : root->getChildren()) + { + LLSD link; + link["link_id"] = child->getID(); + link["link_number"] = link_number++; + link["link_name"] = get_prim_name(child); + link["link_description"] = nv_string(child, "Desc"); + link["inventory"] = buildPrimInventoryLLSD(child); + linked_objects.append(link); + } + if (linked_objects.size() > 0) + { + pub["linked_objects"] = linked_objects; + } + + return pub; +} + +LLSD LLPublishedObjectMgr::buildObjectListLLSD() const +{ + LLSD objects = LLSD::emptyArray(); + for (const auto& [object_id, info] : mPublishedObjects) + { + LLViewerObject* root = gObjectList.findObject(object_id); + if (!root) + { + LL_DEBUGS("ScriptEditorWS") << "object.list: skipping " << object_id + << " (no longer in scene)" << LL_ENDL; + continue; + } + + LLSD pub; + pub["object_id"] = info.mObjectID; + pub["object_name"] = info.mObjectName; + pub["object_description"] = info.mObjectDescription; + pub["owner_id"] = info.mOwnerID; + if (!info.mRegionName.empty()) + { + pub["region"] = info.mRegionName; + } + pub["can_save_back"] = info.mCanSaveBackToContents; + pub["inventory"] = buildPrimInventoryLLSD(root); + + LLSD linked_objects = LLSD::emptyArray(); + for (const auto& prim_info : info.mPrims) + { + if (prim_info.mLinkNumber == 1) + { + continue; + } + + LLViewerObject* child = gObjectList.findObject(prim_info.mPrimID); + if (!child) + { + continue; + } + + LLSD link; + link["link_id"] = prim_info.mPrimID; + link["link_number"] = prim_info.mLinkNumber; + link["link_name"] = prim_info.mPrimName; + link["link_description"] = prim_info.mPrimDescription; + link["inventory"] = buildPrimInventoryLLSD(child); + linked_objects.append(link); + } + if (linked_objects.size() > 0) + { + pub["linked_objects"] = linked_objects; + } + + objects.append(pub); + } + + return objects; +} + +bool LLPublishedObjectMgr::buildLinksetUpdateLLSD( + const LLUUID& root_id, LLSD& update) const +{ + const PublishedObjectInfo* info = getPublished(root_id); + if (!info) + { + return false; + } + + LLSD linked_objects = LLSD::emptyArray(); + for (const PublishedPrimInfo& prim_info : info->mPrims) + { + if (prim_info.mPrimID == root_id) + { + continue; + } + + LLSD entry; + entry["link_id"] = prim_info.mPrimID; + entry["link_number"] = prim_info.mLinkNumber; + + LLViewerObject* prim = gObjectList.findObject(prim_info.mPrimID); + std::string link_name = prim ? get_prim_name(prim) : std::string(); + if (link_name.empty()) + { + link_name = prim_info.mPrimName; + } + std::string link_desc = prim ? nv_string(prim, "Desc") : std::string(); + if (link_desc.empty()) + { + link_desc = prim_info.mPrimDescription; + } + entry["link_name"] = link_name; + entry["link_description"] = link_desc; + entry["inventory"] = prim ? buildPrimInventoryLLSD(prim) : LLSD::emptyArray(); + + linked_objects.append(entry); + } + + update = LLSD(); + update["object_id"] = root_id; + update["linked_objects"] = linked_objects; + return true; +} + +bool LLPublishedObjectMgr::reconcileLinksetChildAdded( + const LLUUID& root_id, + LLViewerObject* child, + F64 request_start_sec) +{ + PublishedObjectInfo* info = getPublished(root_id); + if (!info || !child) + { + return false; + } + + const LLUUID child_id = child->getID(); + + info->mPrims.erase( + std::remove_if( + info->mPrims.begin(), + info->mPrims.end(), + [&](const PublishedPrimInfo& p) { return p.mPrimID == child_id; }), + info->mPrims.end()); + + PublishedPrimInfo prim_info; + prim_info.mPrimID = child_id; + prim_info.mPrimName = get_prim_name(child); + prim_info.mPrimDescription = nv_string(child, "Desc"); + prim_info.mLinkNumber = static_cast<S32>(info->mPrims.size()) + 1; + prim_info.mInventorySerial = -1; + info->mPrims.push_back(prim_info); + + auto listener = std::make_unique<LLPublishedPrimListener>( + mServer, root_id, child_id, child); + info->mListeners.push_back(std::move(listener)); + + mInventoryRequestStartSec[child_id] = request_start_sec; + mNewChildPrims[root_id].insert(child_id); + return true; +} + +bool LLPublishedObjectMgr::reconcileLinksetChildRemoved( + const LLUUID& root_id, const LLUUID& child_id) +{ + PublishedObjectInfo* info = getPublished(root_id); + if (!info) + { + return false; + } + + info->mPrims.erase( + std::remove_if( + info->mPrims.begin(), + info->mPrims.end(), + [&](const PublishedPrimInfo& p) { return p.mPrimID == child_id; }), + info->mPrims.end()); + + info->mListeners.erase( + std::remove_if( + info->mListeners.begin(), + info->mListeners.end(), + [&](const std::unique_ptr<LLPublishedPrimListener>& l) + { + return l->getPrimID() == child_id; + }), + info->mListeners.end()); + + bool root_empty_after_remove = false; + consumePendingNewChild(root_id, child_id, root_empty_after_remove); + + mInventoryRequestStartSec.erase(child_id); + + S32 link_num = 2; + for (auto& p : info->mPrims) + { + if (p.mPrimID != root_id) + { + p.mLinkNumber = link_num++; + } + } + + return true; +} + +bool LLPublishedObjectMgr::handlePrimInventoryReadyEvent( + const LLUUID& object_id, const LLUUID& prim_id) +{ + return markPendingPublishPrimReady(object_id, prim_id); +} + +LLPublishedObjectMgr::PrimInventoryEventResult +LLPublishedObjectMgr::handlePrimInventoryChangedEvent( + const LLUUID& object_id, + const LLUUID& prim_id, + LLViewerObject* prim, + F64 now_sec) +{ + PrimInventoryEventResult result; + if (!hasPublished(object_id) || !prim) + { + return result; + } + + F64 request_start_sec = 0.0; + if (consumeInventoryRequestStart(prim_id, request_start_sec)) + { + result.mTimingConsumed = true; + result.mTimingElapsedSec = llmax(0.0, now_sec - request_start_sec); + } + + InventoryChangeResult inv_result = reconcileInventoryChanged(object_id, prim_id, prim); + result.mKind = inv_result.mKind; + result.mUpdate = inv_result.mUpdate; + + if (result.mKind == InventoryChangeKind::ROOT_INVENTORY_UPDATE || + result.mKind == InventoryChangeKind::CHILD_INVENTORY_UPDATE) + { + std::string pending_item_create_pump; + if (consumePendingItemCreate(prim_id, pending_item_create_pump)) + { + result.mHasPendingItemCreate = true; + result.mPendingItemCreatePump = pending_item_create_pump; + } + } + + return result; +} + +LLPublishedObjectMgr::InventoryChangeResult +LLPublishedObjectMgr::reconcileInventoryChanged( + const LLUUID& object_id, + const LLUUID& prim_id, + LLViewerObject* prim) +{ + InventoryChangeResult result; + PublishedObjectInfo* pub_info = getPublished(object_id); + if (!pub_info || !prim) + { + return result; + } + + bool root_empty_after_remove = false; + if (consumePendingNewChild(object_id, prim_id, root_empty_after_remove)) + { + for (auto& p : pub_info->mPrims) + { + if (p.mPrimID == prim_id) + { + p.mPrimName = get_prim_name(prim); + p.mPrimDescription = nv_string(prim, "Desc"); + p.mInventorySerial = 0; + break; + } + } + result.mKind = root_empty_after_remove + ? InventoryChangeKind::CHILD_READY_FLUSH_NOW + : InventoryChangeKind::CHILD_READY_WAIT; + return result; + } + + result.mUpdate = LLSD(); + result.mUpdate["object_id"] = object_id; + LLSD inv = buildPrimInventoryLLSD(prim); + if (prim_id == object_id) + { + result.mUpdate["inventory"] = inv; + result.mKind = InventoryChangeKind::ROOT_INVENTORY_UPDATE; + } + else + { + LLSD modified_entry; + modified_entry["link_id"] = prim_id; + modified_entry["inventory"] = inv; + LLSD modified_arr = LLSD::emptyArray(); + modified_arr.append(modified_entry); + result.mUpdate["changes"]["linked_objects"]["modified"] = modified_arr; + result.mKind = InventoryChangeKind::CHILD_INVENTORY_UPDATE; + } + return result; +} + +bool LLPublishedObjectMgr::applyPropertyChange( + const LLUUID& root_id, + const LLUUID& prim_id, + const std::string& name, + const std::string& desc, + LLSD& update) +{ + PublishedObjectInfo* pub_info = getPublished(root_id); + if (!pub_info) + { + return false; + } + + update = LLSD(); + update["object_id"] = root_id; + + if (prim_id == root_id) + { + bool has_name = !name.empty(); + bool name_changed = has_name && (pub_info->mObjectName != name); + bool desc_changed = (pub_info->mObjectDescription != desc); + if (!name_changed && !desc_changed) + { + return false; + } + + if (name_changed) + { + pub_info->mObjectName = name; + update["object_name"] = name; + } + if (desc_changed) + { + pub_info->mObjectDescription = desc; + update["object_description"] = desc; + } + return true; + } + + auto prim_it = std::find_if(pub_info->mPrims.begin(), pub_info->mPrims.end(), + [&](const PublishedPrimInfo& p) { return p.mPrimID == prim_id; }); + if (prim_it == pub_info->mPrims.end()) + { + return false; + } + const bool name_changed = !name.empty() && prim_it->mPrimName != name; + const bool desc_changed = prim_it->mPrimDescription != desc; + if (!name_changed && !desc_changed) + { + return false; + } + + LLSD modified_entry; + modified_entry["link_id"] = prim_id; + if (name_changed) + { + prim_it->mPrimName = name; + modified_entry["link_name"] = name; + } + if (desc_changed) + { + prim_it->mPrimDescription = desc; + modified_entry["link_description"] = desc; + } + LLSD modified_arr = LLSD::emptyArray(); + modified_arr.append(modified_entry); + update["changes"]["linked_objects"]["modified"] = modified_arr; + return true; +} + +bool LLPublishedObjectMgr::hasActiveLinksetFlushTimer(const LLUUID& root_id) const +{ + auto it = mLinksetFlushTimers.find(root_id); + if (it == mLinksetFlushTimers.end()) + { + return false; + } + + return !it->second.expired(); +} + +void LLPublishedObjectMgr::setLinksetFlushTimer( + const LLUUID& root_id, const std::weak_ptr<LLEventTimer>& timer) +{ + mLinksetFlushTimers[root_id] = timer; +} + +bool LLPublishedObjectMgr::cancelLinksetFlushTimer(const LLUUID& root_id) +{ + auto it = mLinksetFlushTimers.find(root_id); + if (it == mLinksetFlushTimers.end()) + { + return false; + } + + if (auto locked = it->second.lock()) + { + delete locked.get(); + } + + mLinksetFlushTimers.erase(it); + return true; +} + +void LLPublishedObjectMgr::clearLinksetFlushTimer(const LLUUID& root_id) +{ + mLinksetFlushTimers.erase(root_id); +} + +bool LLPublishedObjectMgr::consumeInventoryRequestStart( + const LLUUID& prim_id, F64& start_sec) +{ + auto it = mInventoryRequestStartSec.find(prim_id); + if (it == mInventoryRequestStartSec.end()) + { + return false; + } + + start_sec = it->second; + mInventoryRequestStartSec.erase(it); + return true; +} + +bool LLPublishedObjectMgr::markPrimInventorySerialAndDetectChange( + const LLUUID& root_id, const LLUUID& prim_id, S16 inventory_serial) +{ + if (inventory_serial < 0) + { + return false; + } + + PublishedObjectInfo* info = getPublished(root_id); + if (!info) + { + return false; + } + + auto it = std::find_if( + info->mPrims.begin(), + info->mPrims.end(), + [&](const PublishedPrimInfo& p) + { + return p.mPrimID == prim_id; + }); + if (it == info->mPrims.end()) + { + return false; + } + + if (it->mInventorySerial == inventory_serial) + { + return false; + } + + it->mInventorySerial = inventory_serial; + return true; +} + +bool LLPublishedObjectMgr::consumePendingNewChild( + const LLUUID& root_id, const LLUUID& child_id, bool& root_empty_after_remove) +{ + root_empty_after_remove = false; + auto root_it = mNewChildPrims.find(root_id); + if (root_it == mNewChildPrims.end()) + { + return false; + } + + auto child_it = root_it->second.find(child_id); + if (child_it == root_it->second.end()) + { + return false; + } + + root_it->second.erase(child_it); + if (root_it->second.empty()) + { + root_empty_after_remove = true; + mNewChildPrims.erase(root_it); + } + + return true; +} + +LLPublishedObjectMgr::PublishedObjectInfo& LLPublishedObjectMgr::finalizePendingPublish( + const LLUUID& object_id, PublishedObjectInfo&& info) +{ + PublishedObjectInfo& published_info = mPublishedObjects[object_id]; + auto pending_it = mPendingPublishes.find(object_id); + published_info = std::move(info); + + if (pending_it != mPendingPublishes.end()) + { + PendingPublish& pending = pending_it->second; + if (pending.mHasRootProperties) + { + if (!pending.mObjectName.empty()) + { + published_info.mObjectName = pending.mObjectName; + } + published_info.mObjectDescription = pending.mObjectDescription; + } + + for (PublishedPrimInfo& prim_info : published_info.mPrims) + { + auto name_it = pending.mPrimNames.find(prim_info.mPrimID); + if (name_it != pending.mPrimNames.end() && !name_it->second.empty()) + { + prim_info.mPrimName = name_it->second; + } + + auto desc_it = pending.mPrimDescriptions.find(prim_info.mPrimID); + if (desc_it != pending.mPrimDescriptions.end()) + { + prim_info.mPrimDescription = desc_it->second; + } + } + + published_info.mListeners = std::move(pending.mListeners); + mPendingPublishes.erase(pending_it); + } + else + { + published_info.mListeners = takePendingPublishListeners(object_id); + } + + return published_info; +} + +bool LLPublishedObjectMgr::cleanupObjectStateForUnpublish(const LLUUID& object_id) +{ + const bool was_published = hasPublished(object_id); + + cancelPendingPublishWithCleanup(object_id); + clearPublishedListeners(object_id); + erasePublished(object_id); + + cancelLinksetFlushTimer(object_id); + clearPendingNewChildren(object_id); + + return was_published; +} + +void LLPublishedObjectMgr::clearPublishedListeners(const LLUUID& object_id) +{ + auto pub_info = getPublished(object_id); + if (!pub_info) + { + return; + } + + pub_info->mListeners.clear(); +} + +void LLPublishedObjectMgr::clearAllStateWithListenerCleanup() +{ + for (auto& [id, pending] : mPendingPublishes) + { + pending.mListeners.clear(); + } + mPendingPublishes.clear(); + + for (auto& [id, info] : mPublishedObjects) + { + info.mListeners.clear(); + } + mPublishedObjects.clear(); +} diff --git a/indra/newview/llpublishedobjectmgr.h b/indra/newview/llpublishedobjectmgr.h new file mode 100644 index 0000000000..51af129dcb --- /dev/null +++ b/indra/newview/llpublishedobjectmgr.h @@ -0,0 +1,334 @@ +/** + * @file llpublishedobjectmgr.h + * @brief Published object state/logic manager extracted from llscripteditorws + * + * $LicenseInfo:firstyear=2026&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2026, 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 "llsd.h" +#include "lltimer.h" +#include "lluuid.h" +#include "lleventtimer.h" +#include "stdtypes.h" + +#include <map> +#include <functional> +#include <memory> +#include <optional> +#include <set> +#include <string> +#include <vector> + +class LLScriptEditorWSServer; +class LLChat; +class LLPublishedPrimListener; +class LLViewerObject; + +class LLPublishedObjectMgr +{ +public: + struct PublishedPrimInfo + { + LLUUID mPrimID; + std::string mPrimName; + S32 mLinkNumber; + std::string mPrimDescription; + S16 mInventorySerial; + }; + + struct PublishedObjectInfo + { + PublishedObjectInfo(); + ~PublishedObjectInfo(); + PublishedObjectInfo(PublishedObjectInfo&&) noexcept; + PublishedObjectInfo& operator=(PublishedObjectInfo&&) noexcept; + PublishedObjectInfo(const PublishedObjectInfo&) = delete; + PublishedObjectInfo& operator=(const PublishedObjectInfo&) = delete; + + LLUUID mObjectID; + LLUUID mOwnerID; + std::string mObjectName; + std::string mObjectDescription; + std::string mRegionName; + bool mCanSaveBackToContents{ false }; + LLUUID mSourceTaskID; + std::vector<PublishedPrimInfo> mPrims; + std::vector<std::unique_ptr<LLPublishedPrimListener>> mListeners; + }; + + struct PendingPublish + { + PendingPublish(); + ~PendingPublish(); + PendingPublish(PendingPublish&&) noexcept; + PendingPublish& operator=(PendingPublish&&) noexcept; + PendingPublish(const PendingPublish&) = delete; + PendingPublish& operator=(const PendingPublish&) = delete; + + LLUUID mObjectID; + std::set<LLUUID> mPendingPrims; + std::vector<std::unique_ptr<LLPublishedPrimListener>> mListeners; + bool mHasRootProperties{ false }; + std::string mObjectName; + std::string mObjectDescription; + std::map<LLUUID, std::string> mPrimNames; + std::map<LLUUID, std::string> mPrimDescriptions; + }; + + enum class InventoryChangeKind + { + NOT_PUBLISHED, + CHILD_READY_WAIT, + CHILD_READY_FLUSH_NOW, + ROOT_INVENTORY_UPDATE, + CHILD_INVENTORY_UPDATE + }; + + struct InventoryChangeResult + { + InventoryChangeKind mKind{ InventoryChangeKind::NOT_PUBLISHED }; + LLSD mUpdate; + }; + + struct PrimInventoryEventResult + { + InventoryChangeKind mKind{ InventoryChangeKind::NOT_PUBLISHED }; + LLSD mUpdate; + bool mTimingConsumed{ false }; + F64 mTimingElapsedSec{ 0.0 }; + bool mHasPendingItemCreate{ false }; + std::string mPendingItemCreatePump; + }; + + class RuntimeEventAggregator + { + public: + enum class Channel + { + DEBUG, + OWNER_SAY + }; + + enum class VM + { + LSL2, + LUAU + }; + + struct StackFrame + { + S32 mLine{ 0 }; + std::string mFunction; + std::string mSource; + }; + + struct ParsedError + { + std::string mSource; + std::string mError; + S32 mLine{ 0 }; + S32 mColumn{ 0 }; + std::vector<StackFrame> mStack; + }; + + struct Fragment + { + LLUUID mFromID; + std::string mFromName; + std::string mText; + }; + + using fragments_t = std::vector<Fragment>; + + struct RuntimeEvent + { + VM mVM; + Channel mChannel; + fragments_t mFragments; + ParsedError mError; + }; + + using FlushCallback = std::function<void(const RuntimeEvent&)>; + + explicit RuntimeEventAggregator(FlushCallback flush_callback); + + void ingest(const LLUUID& from_id, + const std::string& from_name, + const std::string& text, + VM vm, + Channel channel); + void flushExpired(); + void flush(); + ParsedError parseError(VM vm, + const fragments_t& fragments) const; + bool hasPending() const; + + private: + struct PendingBurst + { + LLUUID mFromID; + std::string mFromName; + VM mVM{ VM::LSL2 }; + Channel mChannel{ Channel::DEBUG }; + fragments_t mFragments; + LLTimer mTimer; + }; + + static constexpr F32 FRAGMENT_TIMEOUT = 1.0f; + + void flushPending(); + bool isNewBurst(const LLUUID& from_id, + const std::string& from_name, + VM vm, + Channel channel) const; + + FlushCallback mFlushCallback; + std::unique_ptr<PendingBurst> mPending; + }; + + struct RuntimeChatEvent + { + RuntimeEventAggregator::Channel mChannel; + RuntimeEventAggregator::VM mVM; + LLUUID mRootID; + LLUUID mPrimID; + LLUUID mItemID; + std::string mObjectName; + std::string mScriptName; + std::string mMessage; + std::string mError; + S32 mLine{ 0 }; + S32 mColumn{ 0 }; + std::vector<std::string> mStack; + bool mIsError{ false }; + }; + + using RuntimeEventCallback = + std::function<void(const RuntimeChatEvent&)>; + + explicit LLPublishedObjectMgr( + LLScriptEditorWSServer* server = nullptr, + RuntimeEventCallback runtime_event_callback = {}); + ~LLPublishedObjectMgr(); + + void flushExpiredRuntimeFragments(); + void ingestRuntimeChat( + const LLChat& chat_msg, + RuntimeEventAggregator::Channel channel); + std::optional<RuntimeChatEvent> buildRuntimeChatEvent( + const RuntimeEventAggregator::RuntimeEvent& event) const; + + bool hasPublished(const LLUUID& object_id) const { return mPublishedObjects.find(object_id) != mPublishedObjects.end(); } + void erasePublished(const LLUUID& object_id) { mPublishedObjects.erase(object_id); } + PublishedObjectInfo* getPublished(const LLUUID& object_id); + const PublishedObjectInfo* getPublished(const LLUUID& object_id) const; + + template <typename Fn> + void forEachPublished(Fn&& fn) const + { + for (const auto& [id, info] : mPublishedObjects) + { + fn(id, info); + } + } + + LLSD buildPrimInventoryLLSD(LLViewerObject* object) const; + LLSD buildPublishedObjectLLSD(LLViewerObject* root) const; + LLSD buildObjectListLLSD() const; + bool buildLinksetUpdateLLSD(const LLUUID& root_id, LLSD& update) const; + bool reconcileLinksetChildAdded(const LLUUID& root_id, LLViewerObject* child, F64 request_start_sec); + bool reconcileLinksetChildRemoved(const LLUUID& root_id, const LLUUID& child_id); + bool handlePrimInventoryReadyEvent(const LLUUID& object_id, const LLUUID& prim_id); + PrimInventoryEventResult handlePrimInventoryChangedEvent( + const LLUUID& object_id, + const LLUUID& prim_id, + LLViewerObject* prim, + F64 now_sec); + InventoryChangeResult reconcileInventoryChanged( + const LLUUID& object_id, + const LLUUID& prim_id, + LLViewerObject* prim); + bool applyPropertyChange( + const LLUUID& root_id, + const LLUUID& prim_id, + const std::string& name, + const std::string& desc, + LLSD& update); + + void beginPendingPublish(const LLUUID& object_id, const std::vector<LLViewerObject*>& prims); + bool hasPendingPublish(const LLUUID& object_id) const; + bool markPendingPublishPrimReady(const LLUUID& object_id, const LLUUID& prim_id); + std::vector<std::unique_ptr<LLPublishedPrimListener>> takePendingPublishListeners(const LLUUID& object_id); + void recordPendingPropertyChange( + const LLUUID& root_id, + const LLUUID& prim_id, + const std::string& name, + const std::string& desc); + void cancelPendingPublish(const LLUUID& object_id); + PublishedObjectInfo& finalizePendingPublish(const LLUUID& object_id, PublishedObjectInfo&& info); + bool cleanupObjectStateForUnpublish(const LLUUID& object_id); + void clearAllStateWithListenerCleanup(); + + bool reservePendingItemCreate(const LLUUID& prim_id, std::string&& pump_name); + bool consumePendingItemCreate(const LLUUID& prim_id, std::string& pump_name); + void clearPendingItemCreate(const LLUUID& prim_id); + + bool consumePendingNewChild(const LLUUID& root_id, const LLUUID& child_id, bool& root_empty_after_remove); + void clearPendingNewChildren(const LLUUID& root_id) { mNewChildPrims.erase(root_id); } + + bool hasActiveLinksetFlushTimer(const LLUUID& root_id) const; + void setLinksetFlushTimer(const LLUUID& root_id, const std::weak_ptr<LLEventTimer>& timer); + bool cancelLinksetFlushTimer(const LLUUID& root_id); + void clearLinksetFlushTimer(const LLUUID& root_id); + + void setInventoryRequestStart(const LLUUID& prim_id, F64 start_sec) { mInventoryRequestStartSec[prim_id] = start_sec; } + bool hasInventoryRequestStart(const LLUUID& prim_id) const { return mInventoryRequestStartSec.find(prim_id) != mInventoryRequestStartSec.end(); } + bool consumeInventoryRequestStart(const LLUUID& prim_id, F64& start_sec); + bool markPrimInventorySerialAndDetectChange(const LLUUID& root_id, const LLUUID& prim_id, S16 inventory_serial); + +private: + LLScriptEditorWSServer* mServer{ nullptr }; + std::unique_ptr<RuntimeEventAggregator> mRuntimeEventAggregator; + RuntimeEventCallback mRuntimeEventCallback; + std::unique_ptr<LLEventTimer> mRuntimeFlushTimer; + + static constexpr F32 RUNTIME_FLUSH_INTERVAL = 0.25f; + + void cancelPendingPublishWithCleanup(const LLUUID& object_id); + void clearPublishedListeners(const LLUUID& object_id); + + using published_map_t = std::map<LLUUID, PublishedObjectInfo>; + using pending_publish_map_t = std::map<LLUUID, PendingPublish>; + using pending_item_create_map_t = std::map<LLUUID, std::string>; + using new_child_prims_map_t = std::map<LLUUID, std::set<LLUUID>>; + using linkset_flush_timer_map_t = std::map<LLUUID, std::weak_ptr<LLEventTimer>>; + using inventory_request_start_map_t = std::map<LLUUID, F64>; + + published_map_t mPublishedObjects; + pending_publish_map_t mPendingPublishes; + pending_item_create_map_t mPendingItemCreates; + new_child_prims_map_t mNewChildPrims; + linkset_flush_timer_map_t mLinksetFlushTimers; + inventory_request_start_map_t mInventoryRequestStartSec; +}; diff --git a/indra/newview/llscripteditor.cpp b/indra/newview/llscripteditor.cpp index 59cf3ac02b..ac6b81f677 100644 --- a/indra/newview/llscripteditor.cpp +++ b/indra/newview/llscripteditor.cpp @@ -31,6 +31,179 @@ #include "llsyntaxid.h" #include "lllocalcliprect.h" #include "llviewercontrol.h" +#include "llworkerthread.h" +#include <algorithm> +#include <utility> + +static LLWorkerThread& getSyntaxWorkerThread() +{ + static LLWorkerThread* sThread = new LLWorkerThread("SyntaxParse", true); + return *sThread; +} + +class LLScriptEditorSyntaxWorker final : public LLWorkerClass +{ +public: + struct Request + { + LLWString text; + S32 text_generation = 0; + U32 keywords_generation = 0; + bool disable_highlight = false; + LLKeywords* keywords = nullptr; + }; + + struct Result + { + LLWString text; + LLKeywords::segment_ops_t ops; + S32 text_generation = 0; + U32 keywords_generation = 0; + bool disable_highlight = false; + LLKeywords* keywords = nullptr; + }; + + LLScriptEditorSyntaxWorker(LLWorkerThread* thread, LLScriptEditor* editor) + : LLWorkerClass(thread, "ScriptEditorSyntax"), + mEditor(editor), + mHasPending(false), + mDropResults(false) + { + } + + void queueRequest(const Request& request) + { + bool should_add = false; + { + LLMutexLock lock(&mRequestMutex); + mPendingRequest = request; + mHasPending = true; + should_add = (!haveWork() && !isWorking()); + } + if (should_add) + { + addWork(0); + } + } + + void pump() + { + checkWork(); + bool should_add = false; + { + LLMutexLock lock(&mRequestMutex); + should_add = (!haveWork() && !isWorking() && mHasPending); + } + if (should_add) + { + addWork(0); + } + } + + void waitForIdle(bool drop_results) + { + mDropResults = drop_results; + { + LLMutexLock lock(&mRequestMutex); + mHasPending = false; + } + if (mRequestHandle != LLWorkerThread::nullHandle()) + { + mWorkerThread->waitForResult(mRequestHandle, false); + checkWork(); + } + mDropResults = false; + } + + void shutdown() + { + mEditor = nullptr; + waitForIdle(true); + scheduleDelete(); + } + +private: + void startWork(S32 param) override + { + LLMutexLock lock(&mRequestMutex); + if (!mHasPending) + { + return; + } + mActiveRequest = mPendingRequest; + mHasPending = false; + } + + bool doWork(S32 param) override + { + Request request; + { + LLMutexLock lock(&mRequestMutex); + request = mActiveRequest; + } + + Result result; + result.text = request.text; + result.text_generation = request.text_generation; + result.keywords_generation = request.keywords_generation; + result.disable_highlight = request.disable_highlight; + result.keywords = request.keywords; + + if (request.keywords) + { + request.keywords->collectSegmentOps(result.ops, request.text, request.disable_highlight); + } + + { + LLMutexLock lock(&mResultMutex); + mResult = std::move(result); + } + return true; + } + + void endWork(S32 param, bool aborted) override + { + if (aborted || mDropResults || !mEditor) + { + return; + } + + Result result; + { + LLMutexLock lock(&mResultMutex); + result = std::move(mResult); + } + + if (mEditor->getTextGeneration() != result.text_generation) + { + return; + } + if (mEditor->getKeywordsGeneration() != result.keywords_generation) + { + return; + } + if (&mEditor->getKeywords() != result.keywords) + { + return; + } + + mEditor->queueSyntaxApply(std::move(result.text), + std::move(result.ops), + result.text_generation, + result.keywords_generation, + result.disable_highlight, + result.keywords); + } + + LLScriptEditor* mEditor; + LLMutex mRequestMutex; + LLMutex mResultMutex; + Request mPendingRequest; + Request mActiveRequest; + Result mResult; + bool mHasPending; + bool mDropResults; +}; const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32; @@ -45,7 +218,21 @@ LLScriptEditor::Params::Params() LLScriptEditor::LLScriptEditor(const Params& p) : LLTextEditor(p) , mShowLineNumbers(p.show_line_numbers), - mUseDefaultFontSize(p.default_font_size) + mUseDefaultFontSize(p.default_font_size), + mLuauLanguage(false), + mKeywordsGeneration(0), + mLastQueuedTextGeneration(-1), + mLastQueuedKeywordsGeneration(0), + mLastQueuedDisableHighlight(false), + mLastQueuedKeywords(nullptr), + mSyntaxWorker(nullptr), + mSyntaxApplyState(SyntaxApplyState::Idle), + mPendingApplyOpIndex(0), + mPendingApplySegmentIndex(0), + mPendingApplyTextGeneration(-1), + mPendingApplyKeywordsGeneration(0), + mPendingApplyDisableHighlight(false), + mPendingApplyKeywords(nullptr) { if (mShowLineNumbers) { @@ -54,10 +241,22 @@ LLScriptEditor::LLScriptEditor(const Params& p) } } +LLScriptEditor::~LLScriptEditor() +{ + if (mSyntaxWorker) + { + mSyntaxWorker->shutdown(); + getSyntaxWorkerThread().update(0.f); + mSyntaxWorker = nullptr; + } +} + bool LLScriptEditor::postBuild() { gSavedSettings.getControl("LSLFontSizeName")->getCommitSignal()->connect(boost::bind(&LLScriptEditor::onFontSizeChange, this)); - return LLTextEditor::postBuild(); + bool result = LLTextEditor::postBuild(); + setFont(getScriptFont()); + return result; } void LLScriptEditor::draw() @@ -119,7 +318,7 @@ void LLScriptEditor::drawLineNumbers() // draw the line numbers if(line.mLineNum != last_line_num && line.mRect.mTop <= scrolled_view_rect.mTop) { - const LLWString ltext = utf8str_to_wstring(llformat("%d", line.mLineNum )); + const LLWString ltext = utf8str_to_wstring(llformat("%d", mLuauLanguage ? line.mLineNum + 1 : line.mLineNum)); bool is_cur_line = cursor_line == line.mLineNum; const U8 style = is_cur_line ? LLFontGL::BOLD : LLFontGL::NORMAL; const LLColor4& fg_color = is_cur_line ? mCursorColor : mReadOnlyFgColor; @@ -141,49 +340,220 @@ void LLScriptEditor::drawLineNumbers() } } -void LLScriptEditor::initKeywords() +void LLScriptEditor::initKeywords(bool luau_language) { - mKeywords.initialize(LLSyntaxIdLSL::getInstance()->getKeywordsXML()); + mKeywordsLua.initialize(LLSyntaxDefCache::getInstance()->getLuaKeywords(), true); + mKeywordsLSL.initialize(LLSyntaxDefCache::getInstance()->getLSLKeywords(), false); + + mLuauLanguage = luau_language; + } void LLScriptEditor::loadKeywords() { LL_PROFILE_ZONE_SCOPED; - mKeywords.processTokens(); - - LLStyleConstSP style = new LLStyle(LLStyle::Params().font(getScriptFont()).color(mDefaultColor.get())); + ensureSyntaxWorker(); + mSyntaxWorker->waitForIdle(true); + resetPendingSyntaxApply(); + getKeywords().processTokens(); + ++mKeywordsGeneration; - segment_vec_t segment_list; - mKeywords.findSegments(&segment_list, getWText(), *this, style); - - mSegments.clear(); - segment_set_t::iterator insert_it = mSegments.begin(); - for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it) + LLKeywords::segment_ops_t ops; + const LLWString& text = getWText(); + const llwchar* base = text.c_str(); + for (const llwchar* cur = base; *cur; ++cur) { - insert_it = mSegments.insert(insert_it, *list_it); + if (*cur == '\n') + { + ops.push_back({LLKeywords::SegmentOp::OP_LINE_BREAK, (S32)(cur - base), 0, nullptr}); + } } + applySyntaxSegments(text, ops); + queueSyntaxParse(); } void LLScriptEditor::updateSegments() { - if (mReflowIndex < S32_MAX && mKeywords.isLoaded() && mParseOnTheFly) + if (getKeywords().isLoaded() && mParseOnTheFly) { LL_PROFILE_ZONE_SCOPED; + ensureSyntaxWorker(); + mSyntaxWorker->pump(); + if (mReflowIndex < S32_MAX) + { + queueSyntaxParse(); + } + processPendingSyntaxApply(); + } + + LLTextBase::updateSegments(); +} + +void LLScriptEditor::ensureSyntaxWorker() +{ + if (!mSyntaxWorker) + { + mSyntaxWorker = new LLScriptEditorSyntaxWorker(&getSyntaxWorkerThread(), this); + } +} + +void LLScriptEditor::queueSyntaxParse() +{ + static LLCachedControl<bool> sDisableSyntaxHighlighting(gSavedSettings, "ScriptEditorDisableSyntaxHighlight", false); + const bool disable_syntax_highlighting = sDisableSyntaxHighlighting; + + LLKeywords* keywords = &getKeywords(); + const S32 text_generation = getTextGeneration(); + + if (mLastQueuedTextGeneration == text_generation + && mLastQueuedKeywordsGeneration == mKeywordsGeneration + && mLastQueuedDisableHighlight == disable_syntax_highlighting + && mLastQueuedKeywords == keywords) + { + return; + } + + mLastQueuedTextGeneration = text_generation; + mLastQueuedKeywordsGeneration = mKeywordsGeneration; + mLastQueuedDisableHighlight = disable_syntax_highlighting; + mLastQueuedKeywords = keywords; + + LLScriptEditorSyntaxWorker::Request request; + request.text = getWText(); + request.text_generation = text_generation; + request.keywords_generation = mKeywordsGeneration; + request.disable_highlight = disable_syntax_highlighting; + request.keywords = keywords; + mSyntaxWorker->queueRequest(request); +} + +void LLScriptEditor::queueSyntaxApply(LLWString text, + LLKeywords::segment_ops_t ops, + S32 text_generation, + U32 keywords_generation, + bool disable_highlight, + LLKeywords* keywords) +{ + if (text_generation != getTextGeneration() + || keywords_generation != mKeywordsGeneration + || keywords != &getKeywords()) + { + return; + } + + resetPendingSyntaxApply(); + + // Small updates can apply synchronously; larger ones use background slices. + constexpr size_t kImmediateOpsThreshold = 500; + if (ops.size() <= kImmediateOpsThreshold) + { + applySyntaxSegments(text, ops); + return; + } + + mPendingApplyText = std::move(text); + mPendingApplyOps = std::move(ops); + mPendingApplyTextGeneration = text_generation; + mPendingApplyKeywordsGeneration = keywords_generation; + mPendingApplyDisableHighlight = disable_highlight; + mPendingApplyKeywords = keywords; + mPendingApplyOpIndex = 0; + mPendingApplySegmentIndex = 0; + mPendingApplySegments.clear(); + mPendingApplySegmentSet.clear(); + mPendingApplyStyle = new LLStyle(LLStyle::Params().font(getScriptFont()).color(mDefaultColor.get())); + mSyntaxApplyState = SyntaxApplyState::Building; +} + +void LLScriptEditor::processPendingSyntaxApply() +{ + if (mSyntaxApplyState == SyntaxApplyState::Idle) + { + return; + } - LLStyleConstSP style = new LLStyle(LLStyle::Params().font(getScriptFont()).color(mDefaultColor.get())); + static LLCachedControl<bool> sDisableSyntaxHighlighting(gSavedSettings, "ScriptEditorDisableSyntaxHighlight", false); + if (mPendingApplyTextGeneration != getTextGeneration() + || mPendingApplyKeywordsGeneration != mKeywordsGeneration + || mPendingApplyKeywords != &getKeywords() + || mPendingApplyDisableHighlight != sDisableSyntaxHighlighting) + { + resetPendingSyntaxApply(); + return; + } - // HACK: No non-ascii keywords for now - segment_vec_t segment_list; - mKeywords.findSegments(&segment_list, getWText(), *this, style); + // Slice sizes control UI budget while applying large highlight updates. + constexpr size_t kOpsPerSlice = 250; + constexpr size_t kSegmentsPerSlice = 250; - clearSegments(); - for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it) + if (mSyntaxApplyState == SyntaxApplyState::Building) + { + if (mPendingApplyStyle.isNull()) + { + mPendingApplyStyle = new LLStyle(LLStyle::Params().font(getScriptFont()).color(mDefaultColor.get())); + } + bool done = getKeywords().applySegmentOpsRange(&mPendingApplySegments, + mPendingApplyText, + mPendingApplyOps, + mPendingApplyOpIndex, + kOpsPerSlice, + *this, + mPendingApplyStyle); + if (done) { - insertSegment(*list_it); + mSyntaxApplyState = SyntaxApplyState::Inserting; } + return; } - LLTextBase::updateSegments(); + size_t end_index = std::min(mPendingApplySegmentIndex + kSegmentsPerSlice, mPendingApplySegments.size()); + for (; mPendingApplySegmentIndex < end_index; ++mPendingApplySegmentIndex) + { + LLTextSegmentPtr segment = mPendingApplySegments[mPendingApplySegmentIndex]; + segment->linkToDocument(this); + mPendingApplySegmentSet.insert(segment); + } + + if (mPendingApplySegmentIndex >= mPendingApplySegments.size()) + { + S32 saved_scroll_index = mScrollIndex; + segment_set_t old_segments; + old_segments.swap(mSegments); + mSegments.swap(mPendingApplySegmentSet); + mScrollIndex = saved_scroll_index; + needsReflow(0); + resetPendingSyntaxApply(); + } +} + +void LLScriptEditor::resetPendingSyntaxApply() +{ + mSyntaxApplyState = SyntaxApplyState::Idle; + mPendingApplyText.clear(); + mPendingApplyOps.clear(); + mPendingApplySegments.clear(); + mPendingApplySegmentSet.clear(); + mPendingApplyOpIndex = 0; + mPendingApplySegmentIndex = 0; + mPendingApplyStyle = LLStyleConstSP(); + mPendingApplyTextGeneration = -1; + mPendingApplyKeywordsGeneration = 0; + mPendingApplyDisableHighlight = false; + mPendingApplyKeywords = nullptr; +} + +void LLScriptEditor::applySyntaxSegments(const LLWString& text, const LLKeywords::segment_ops_t& ops) +{ + LLStyleConstSP style = new LLStyle(LLStyle::Params().font(getScriptFont()).color(mDefaultColor.get())); + + segment_vec_t segment_list; + getKeywords().applySegmentOps(&segment_list, text, ops, *this, style); + + clearSegments(); + for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it) + { + insertSegment(*list_it); + } } void LLScriptEditor::clearSegments() @@ -194,6 +564,21 @@ void LLScriptEditor::clearSegments() } } +LLKeywords::keyword_iterator_t LLScriptEditor::keywordsBegin() +{ + return getKeywords().begin(); +} + +LLKeywords::keyword_iterator_t LLScriptEditor::keywordsEnd() +{ + return getKeywords().end(); +} + +LLKeywords& LLScriptEditor::getKeywords() +{ + return mLuauLanguage ? mKeywordsLua : mKeywordsLSL; +} + // Most of this is shamelessly copied from LLTextBase void LLScriptEditor::drawSelectionBackground() { @@ -218,7 +603,6 @@ void LLScriptEditor::drawSelectionBackground() ++rect_it) { LLRect selection_rect = *rect_it; - selection_rect = *rect_it; selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom); gl_rect_2d(selection_rect, selection_color); } @@ -241,6 +625,7 @@ void LLScriptEditor::onFontSizeChange() { if (!mUseDefaultFontSize) { + setFont(getScriptFont()); needsReflow(); } } diff --git a/indra/newview/llscripteditor.h b/indra/newview/llscripteditor.h index 1632ebe834..dcbfdf3085 100644 --- a/indra/newview/llscripteditor.h +++ b/indra/newview/llscripteditor.h @@ -29,6 +29,7 @@ #define LL_SCRIPTEDITOR_H #include "lltexteditor.h" +#include <cstddef> class LLScriptEditor : public LLTextEditor { @@ -41,17 +42,22 @@ public: Params(); }; - virtual ~LLScriptEditor() {}; + ~LLScriptEditor() override; // LLView override - virtual void draw(); - bool postBuild(); + void draw() override; + bool postBuild() override; - void initKeywords(); + void initKeywords(bool luau_language = false); void loadKeywords(); - /* virtual */ void clearSegments(); - LLKeywords::keyword_iterator_t keywordsBegin() { return mKeywords.begin(); } - LLKeywords::keyword_iterator_t keywordsEnd() { return mKeywords.end(); } + void clearSegments(); + LLKeywords::keyword_iterator_t keywordsBegin(); + LLKeywords::keyword_iterator_t keywordsEnd(); + LLKeywords& getKeywords(); + bool getIsLuauLanguage() { return mLuauLanguage; } + void setLuauLanguage(bool luau_language) { mLuauLanguage = luau_language; } + U32 getKeywordsGeneration() const { return mKeywordsGeneration; } + void applySyntaxSegments(const LLWString& text, const LLKeywords::segment_ops_t& ops); static std::string getScriptFontSize(); LLFontGL* getScriptFont(); @@ -59,18 +65,54 @@ public: protected: friend class LLUICtrlFactory; + friend class LLScriptEditorSyntaxWorker; LLScriptEditor(const Params& p); private: + enum class SyntaxApplyState + { + Idle, + Building, + Inserting + }; void drawLineNumbers(); - /* virtual */ void updateSegments(); - /* virtual */ void drawSelectionBackground(); - void loadKeywords(const std::string& filename_keywords, - const std::string& filename_colors); + void updateSegments() override; + void drawSelectionBackground() override; + void ensureSyntaxWorker(); + void queueSyntaxParse(); + void queueSyntaxApply(LLWString text, + LLKeywords::segment_ops_t ops, + S32 text_generation, + U32 keywords_generation, + bool disable_highlight, + LLKeywords* keywords); + void processPendingSyntaxApply(); + void resetPendingSyntaxApply(); + + LLKeywords mKeywordsLua; + LLKeywords mKeywordsLSL; + bool mLuauLanguage; - LLKeywords mKeywords; bool mShowLineNumbers; bool mUseDefaultFontSize; + U32 mKeywordsGeneration; + S32 mLastQueuedTextGeneration; + U32 mLastQueuedKeywordsGeneration; + bool mLastQueuedDisableHighlight; + LLKeywords* mLastQueuedKeywords; + class LLScriptEditorSyntaxWorker* mSyntaxWorker; + SyntaxApplyState mSyntaxApplyState; + LLWString mPendingApplyText; + LLKeywords::segment_ops_t mPendingApplyOps; + segment_vec_t mPendingApplySegments; + segment_set_t mPendingApplySegmentSet; + size_t mPendingApplyOpIndex; + size_t mPendingApplySegmentIndex; + LLStyleConstSP mPendingApplyStyle; + S32 mPendingApplyTextGeneration; + U32 mPendingApplyKeywordsGeneration; + bool mPendingApplyDisableHighlight; + LLKeywords* mPendingApplyKeywords; }; #endif // LL_SCRIPTEDITOR_H diff --git a/indra/newview/llscripteditorws.cpp b/indra/newview/llscripteditorws.cpp new file mode 100644 index 0000000000..f886be819f --- /dev/null +++ b/indra/newview/llscripteditorws.cpp @@ -0,0 +1,2713 @@ +/** + * @file llscripteditorws.cpp + * @brief JSON-RPC 2.0 WebSocket server implementation for external script editor integration + * + * For a full description of the JSON-RPC protocol and all supported methods, + * see doc/external-editor-json-rpc.md in the repository root. + * + * $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 "llscripteditorws.h" + +#include "llagent.h" +#include "llagentcamera.h" +#include "llappviewer.h" +#include "llchat.h" +#include "lldate.h" +#include "llerror.h" +#include "lleventcoro.h" +#include "lleventfilter.h" +#include "llevents.h" +#include "llfilesystem.h" +#include "llfloaterperms.h" +#include "llfloaterreg.h" +#include "llinventorytype.h" +#include "llinventorydefines.h" +#include "llnotecard.h" +#include "llnotificationsutil.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llprocess.h" +#include "llregex.h" +#include "llmd5.h" +#include "llsdjson.h" +#include "llselectmgr.h" +#include "lltrans.h" +#include "lluuid.h" +#include "llversioninfo.h" +#include "llviewerassetstorage.h" +#include "llviewerassettype.h" +#include "llviewerassetupload.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewermenu.h" +#include "llviewertexteditor.h" +#include "llvoinventorylistener.h" +#include "roles_constants.h" + +#include <array> + +namespace +{ + // Per-operation timeouts (seconds) for coroutine-based async RPC handlers. + constexpr F32 ASSET_FETCH_TIMEOUT = 30.0f; + constexpr F32 SCRIPT_UPLOAD_TIMEOUT = 60.0f; + constexpr F32 NOTECARD_UPLOAD_TIMEOUT = 30.0f; + constexpr F32 ITEM_CREATE_TIMEOUT = 30.0f; + + // Linkset flush coalescing delays (seconds). + constexpr F32 LINKSET_ADD_FLUSH_DELAY = 5.0f; + constexpr F32 LINKSET_REMOVE_FLUSH_DELAY = 0.2f; + + static const boost::regex LUAU_LOCATION_PATTERN( + R"(^([^:]*):([0-9]+):\s*(.*)$)"); + + static const boost::regex LSL_LOCATION_PATTERN( + R"(\((\d+), (\d+)\) : ([^:]+) : (.+))"); + + // Creates a uniquely-named LLEventMailDrop under "<prefix>.<uuid>", passes + // its name to kickoff (which arranges for one post to that pump), then + // suspends the current coroutine up to imeout seconds for the result. + // Throws RequestTimeoutError(timeout_msg) if the deadline elapses. + template <typename Kickoff> + LLSD await_async_result(const std::string& pump_prefix, + F32 timeout, + const std::string& timeout_msg, + Kickoff&& kickoff) + { + LLEventMailDrop pump(pump_prefix + "." + LLUUID::generateNewID().asString(), true); + std::string pump_name = pump.getName(); + std::forward<Kickoff>(kickoff)(pump_name); + LLSD result = llcoro::suspendUntilEventOnWithTimeout( + pump, timeout, LLSD().with("timeout", true)); + if (result.has("timeout")) + { + throw LLJSONRPCConnection::RequestTimeoutError(timeout_msg); + } + return result; + } + + // Builds the (success, failure) callback pair used by LLResourceUploadInfo- + // derived uploads. Both outcomes post a single LLSD to pump_name: + // - success: the server's response LLSD with item_id/task_id added. + // - failure: { "failed": true, "reason": <reason> }. + auto make_asset_upload_callbacks(const std::string& pump_name) + { + auto on_success = [pump_name](LLUUID item_id, LLUUID task_id, LLUUID /*new_asset_id*/, LLSD response) + { + response["item_id"] = item_id; + response["task_id"] = task_id; + LLEventPumps::instance().post(pump_name, response); + }; + auto on_failure = [pump_name](LLUUID /*item_id*/, LLUUID /*task_id*/, LLSD /*response*/, std::string reason) + { + LLSD failure; + failure["failed"] = true; + failure["reason"] = reason; + LLEventPumps::instance().post(pump_name, failure); + return false; + }; + return std::make_pair(std::move(on_success), std::move(on_failure)); + } + + // Returns [root, *root->getChildren()] in stable order. Root must be non-null. + std::vector<LLViewerObject*> collect_linkset(LLViewerObject* root) + { + std::vector<LLViewerObject*> prims; + const auto& children = root->getChildren(); + prims.reserve(1 + children.size()); + prims.push_back(root); + for (LLViewerObject* child : children) + { + prims.push_back(child); + } + return prims; + } + + // Returns the value of NV pair key on obj as a string, or empty if + // obj / pair / string is null or empty. NUL-safe. + std::string nv_string(LLViewerObject* obj, const char* key) + { + if (!obj) + { + return std::string(); + } + LLNameValue* nv = obj->getNVPair(key); + if (!nv) + { + return std::string(); + } + const char* s = nv->getString(); + if (!s || s[0] == '\0') + { + return std::string(); + } + return std::string(s); + } + +} + +//======================================================================== +LLScriptEditorWSServer::LLScriptEditorWSServer(const std::string& name, U16 port, bool local_only): + LLJSONRPCServer(name, port, local_only), + mPublishedObjectManager( + this, + [this](const LLPublishedObjectMgr::RuntimeChatEvent& event) + { + sendRuntimeEvent(event); + }) +{ + LL_INFOS("ScriptEditorWS") << "Created JSON-RPC script editor server: " << name + << " on port " << port << LL_ENDL; + + registerCommand({ "viewer.teleport", "Teleport agent to an in-world object" }, + [](U32, const LLSD& p) -> LLSD + { + LLUUID object_id = p["object_id"].asUUID(); + if (object_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("object_id is required"); + + LLViewerObject* object = gObjectList.findObject(object_id); + if (!object) + throw LLJSONRPCConnection::InvalidParams("object_id not found"); + + LLVector3d global_pos = object->getPositionGlobal(); + gAgent.teleportViaLocation(global_pos); + + LLSD response; + response["success"] = true; + return response; + }); + + registerCommand({ "viewer.camera.focus", "Zoom camera to an in-world object (same behavior as context menu Zoom In)" }, + [](U32, const LLSD& p) -> LLSD + { + LLUUID object_id = p["object_id"].asUUID(); + if (object_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("object_id is required"); + + if (!handle_zoom_to_object(object_id)) + { + throw LLJSONRPCConnection::InternalError( + "Object not found or not reachable"); + } + + LLSD response; + response["success"] = true; + return response; + }); + + registerCommand({ "viewer.object.save_back_to_contents", "Save an in-world object back to source object contents" }, + [this](U32 connection_id, const LLSD& p) -> LLSD + { + return this->handleSaveBackToObjectContents(connection_id, p); + }); +} + +LLScriptEditorWSServer::ptr_t LLScriptEditorWSServer::getServer() +{ + if (!LLWebsocketMgr::instanceExists()) + { + return nullptr; + } + LLWebsocketMgr& wsmgr = LLWebsocketMgr::instance(); + return std::static_pointer_cast<LLScriptEditorWSServer>( + wsmgr.findServerByName(LLScriptEditorWSServer::DEFAULT_SERVER_NAME)); +} + +bool LLScriptEditorWSServer::isEnabled() +{ + static LLCachedControl<bool> OPT_ENABLESCRIPTEDITORWS(gSavedSettings, "ExternalWebsocketSyncEnable", false); + return OPT_ENABLESCRIPTEDITORWS; +} + +bool LLScriptEditorWSServer::isTightIntegration() +{ + static LLCachedControl<bool> OPT_TIGHTINTEGRATION(gSavedSettings, "ExternalWebsocketSyncTightIntegration", false); + return OPT_TIGHTINTEGRATION; +} + +LLScriptEditorWSServer::ptr_t LLScriptEditorWSServer::ensureServerRunning() +{ + if (!LLScriptEditorWSServer::isEnabled()) + { + LL_DEBUGS("ScriptEditorWS") << "WebSocket server is disabled by ExternalWebsocketSyncEnable" << LL_ENDL; + return nullptr; + } + + LLWebsocketMgr& wsmgr = LLWebsocketMgr::instance(); + ptr_t server = std::static_pointer_cast<LLScriptEditorWSServer>( + wsmgr.findServerByName(DEFAULT_SERVER_NAME)); + + if (!server) + { + U16 port = static_cast<U16>(gSavedSettings.getS32("ExternalWebsocketSyncPort")); + bool local_only = gSavedSettings.getBOOL("ExternalWebsocketSyncLocal"); + server = std::make_shared<LLScriptEditorWSServer>(DEFAULT_SERVER_NAME, port, local_only); + wsmgr.addServer(server); + } + + if (!server->isRunning()) + { + U16 port = static_cast<U16>(gSavedSettings.getS32("ExternalWebsocketSyncPort")); + LLSD args; + args["PORT"] = static_cast<S32>(port); + + if (!wsmgr.startServer(DEFAULT_SERVER_NAME)) + { + LL_WARNS("ScriptEditorWS") << "Failed to start script editor websocket server" << LL_ENDL; + LLNotificationsUtil::add("ExternalEditorServerFailed", args); + return nullptr; + } + + LLNotificationsUtil::add("ExternalEditorServerStarted", args); + } + + return server; +} + +std::string LLScriptEditorWSServer::buildScriptSubscriptionId(const LLUUID& object_id, + const LLUUID& item_id) +{ + std::string script_id = object_id.asString() + "_" + item_id.asString(); + + std::array<char, MD5HEX_STR_SIZE> script_id_hash_str = {}; + LLMD5 script_id_hash((const U8*)script_id.c_str()); + script_id_hash.hex_digest(script_id_hash_str.data()); + + return std::string(script_id_hash_str.data()); +} + +std::string LLScriptEditorWSServer::buildVSCodeURI(const LLUUID& object_id, + const LLUUID& script_id) +{ + std::ostringstream uri; + uri << "vscode://lindenlab.sl-vscode-plugin/connect"; + + U16 port = static_cast<U16>(gSavedSettings.getS32("ExternalWebsocketSyncPort")); + uri << "?port=" << port; + + if (object_id.notNull()) + { + uri << "&object=" << object_id.asString(); + } + + if (script_id.notNull()) + { + uri << "&script=" << script_id.asString(); + } + + return uri.str(); +} + +bool LLScriptEditorWSServer::launchVSCode(const LLUUID& object_id, + const LLUUID& script_id) +{ + ptr_t server = ensureServerRunning(); + if (!server) + { + LL_WARNS("ScriptEditorWS") << "Cannot launch VS Code: WebSocket server failed to start" << LL_ENDL; + return false; + } + + std::string uri = buildVSCodeURI(object_id, script_id); + + LLProcess::Params params; +#if LL_WINDOWS + // On Windows, VS Code's 'code' is a batch file (.cmd) which APR cannot + // launch directly. Invoke it through cmd.exe instead. + // The URI may contain '&' which cmd.exe treats as a command separator, + // so the entire argument list is passed as a single quoted string. + params.executable = "cmd.exe"; + params.args.add("/c"); + params.args.add("code --open-url \"" + uri + "\""); +#else + params.executable = "code"; + params.args.add("--open-url"); + params.args.add(uri); +#endif + params.autokill = false; + + LLProcessPtr process = LLProcess::create(params); + if (!process) + { + LL_WARNS("ScriptEditorWS") << "Failed to launch VS Code. " + << "Ensure the 'code' command is available on your PATH." << LL_ENDL; + return false; + } + + LL_INFOS("ScriptEditorWS") << "Launched VS Code with URI: " << uri << LL_ENDL; + return true; +} + + +LLWebsocketMgr::WSConnection::ptr_t LLScriptEditorWSServer::connectionFactory(LLWebsocketMgr::WSServer::ptr_t server, + LLWebsocketMgr::connection_h handle) +{ + auto connection = std::make_shared<LLScriptEditorWSConnection>(server, handle); + mActiveConnections[connection->getConnectionID()] = connection; + + // Call setupConnectionMethods to register any global methods + setupConnectionMethods(connection); + + return connection; +} + +void LLScriptEditorWSServer::onStarted() +{ + LLSyntaxDefCache& syntax_id_mgr = LLSyntaxDefCache::instance(); + wptr_t that(std::static_pointer_cast<LLScriptEditorWSServer>(shared_from_this())); + + mLastSyntaxId = syntax_id_mgr.getSyntaxID(); + mLanguageChangeSignal = syntax_id_mgr.addSyntaxIDCallback( + [that]() + { + auto server = that.lock(); + if (server && server->isRunning()) + { + server->broadcastLanguageChange(); + } + }); +} + +void LLScriptEditorWSServer::onStopped() +{ + mLanguageChangeSignal.disconnect(); + mLastSyntaxId.setNull(); + + // Connections are already closed -- clean up all internal state silently. + // Do not attempt to send notifications; the sockets are gone. + + mPublishedObjectManager.clearAllStateWithListenerCleanup(); + + mSubscriptions.clear(); + mActiveConnections.clear(); + + LL_INFOS("ScriptEditorWS") << "Script editor WebSocket server stopped, all state cleaned up" << LL_ENDL; + + LLNotificationsUtil::add("ExternalEditorServerStopped"); +} + +void LLScriptEditorWSServer::onConnectionOpened(const LLWebsocketMgr::WSConnection::ptr_t& connection) +{ + // Call parent class to handle JSON-RPC setup and standard methods + LLJSONRPCServer::onConnectionOpened(connection); + + LL_INFOS("ScriptEditorWS") << "New script editor client connected via JSON-RPC" << LL_ENDL; + +} + +void LLScriptEditorWSServer::onConnectionClosed(const LLWebsocketMgr::WSConnection::ptr_t& connection) +{ + // Call parent class to handle JSON-RPC cleanup + LLJSONRPCServer::onConnectionClosed(connection); + + LL_INFOS("ScriptEditorWS") << "Script editor client disconnected" << LL_ENDL; + + // Remove from active connections + auto script_connection = std::dynamic_pointer_cast<LLScriptEditorWSConnection>(connection); + if (script_connection) + { + U32 connection_id = script_connection->getConnectionID(); + unsubscribeConnection(connection_id); + mActiveConnections.erase(connection_id); + + LL_DEBUGS("ScriptEditorWS") << "Removed connection from active connections. Total: " + << mActiveConnections.size() << LL_ENDL; + // TODO: When connections reach 0, stop the server after a timeout. + } +} + +bool LLScriptEditorWSServer::subscribeScriptEditor(const LLUUID& object_id, const LLUUID& item_id, std::string_view script_name, + const LLHandle<LLPanel>& editor_handle, const std::string& script_id) +{ + if (editor_handle.isDead()) + { + return false; + } + + auto it = mSubscriptions.find(script_id); + if (it == mSubscriptions.end()) + { + // New subscription + ItemRef item_ref; + item_ref.mPrimID = object_id; + item_ref.mItemID = item_id; + item_ref.mScriptName = script_name; + mSubscriptions.emplace(script_id, + EditorSubscription(item_ref, editor_handle)); + } + else + { + // Refresh existing subscription with the new editor handle + it->second.mEditorHandle = editor_handle; + } + return true; +} + +void LLScriptEditorWSServer::unsubscribeEditor(const std::string &script_id) +{ + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end()) + { + S32 connection_id = it->second.mConnectionID; + auto connection = it->second.mConnection.lock(); + mSubscriptions.erase(it); + + if (connection_id != 0) + { + auto cit = mConnectionSubscriptionCounts.find(connection_id); + if (cit != mConnectionSubscriptionCounts.end()) + { + if (--cit->second <= 0) + { + mConnectionSubscriptionCounts.erase(cit); + } + } + } + + } +} + +void LLScriptEditorWSServer::unsubscribeConnection(U32 connection_id) +{ + for (auto it = mSubscriptions.begin(); it != mSubscriptions.end(); ++it) + { + if (it->second.mConnectionID == connection_id) + { + LL_DEBUGS("ScriptEditorWS") << "Unsubscribing script " << it->first + << " from connection ID " << connection_id << LL_ENDL; + it->second.mConnectionID = 0; + it->second.mConnection.reset(); + } + } + // All subs for this connection now have mConnectionID == 0. + mConnectionSubscriptionCounts.erase(connection_id); +} + +LLScriptEditorWSServer::SubscriptionError LLScriptEditorWSServer::updateScriptSubscription(const std::string &script_id, U32 connection_id) +{ + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end()) + { + if (it->second.mEditorHandle.isDead()) + { + unsubscribeEditor(script_id); + return SubscriptionError::INVALID_EDITOR; + } + + auto con_it = mActiveConnections.find(connection_id); + if (con_it == mActiveConnections.end()) + { + return SubscriptionError::INTERNAL_ERROR; + } + + if ((it->second.mConnectionID != 0) && !it->second.mConnection.expired() + && it->second.mConnection.lock()->isConnected()) + { + LL_WARNS("ScriptEditorWS") << "Script " << script_id << " is already subscribed on connection ID " << it->second.mConnectionID + << ", cannot subscribe again on connection ID " << connection_id << LL_ENDL; + // In the future we may want to support multiple connections per script. + // That would imply it was open in multiple editors. + return SubscriptionError::ALREADY_SUBSCRIBED; + } + + // If this entry was previously bound to a different (dead) connection, + // it would have been cleared by unsubscribeConnection, so mConnectionID + // is always 0 here. + it->second.mConnectionID = connection_id; + it->second.mConnection = con_it->second; + ++mConnectionSubscriptionCounts[connection_id]; + return SubscriptionError::SUCCESS; + } + return SubscriptionError::INVALID_SUBSCRIPTION; +} + + +LLHandle<LLPanel> LLScriptEditorWSServer::findEditorForScript(const std::string& script_id) const +{ + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end()) + { + return it->second.mEditorHandle; + } + return LLHandle<LLPanel>(); +} + +std::set<std::string> LLScriptEditorWSServer::getActiveScripts() const +{ + std::set<std::string> active_scripts; + for (const auto& [script_id, subinfo] : mSubscriptions) + { + if (!subinfo.mEditorHandle.isDead()) + { + active_scripts.insert(script_id); + } + } + return active_scripts; +} + +void LLScriptEditorWSServer::setupConnectionMethods(LLJSONRPCConnection::ptr_t connection) +{ + // Call parent class to register global JSON-RPC methods + LLJSONRPCServer::setupConnectionMethods(connection); + + // Cast to our specific connection type to access script editor functionality + auto script_connection = std::dynamic_pointer_cast<LLScriptEditorWSConnection>(connection); + if (script_connection) + { + LL_DEBUGS("ScriptEditorWS") << "Setting up script editor connection methods" << LL_ENDL; + U32 connection_id = script_connection->getConnectionID(); + + // Sync methods (run on the WebSocket I/O thread; must not touch + // main-thread-only viewer state). + script_connection->registerMethod("language.syntax.id", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, auto&) + { + return s.handleLanguageIdRequest(); + })); + + script_connection->registerMethod("language.syntax", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleSyntaxRequest(params); + })); + + script_connection->registerMethod("language.syntax.cache", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, auto&) + { + return s.handleSyntaxCacheRequest(); + })); + + script_connection->registerMethod("language.syntax.get", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleSyntaxCacheFileRequest(params); + })); + + script_connection->registerAsyncMethod("script.subscribe", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleScriptSubscribe(connection_id, params); + })); + + script_connection->registerMethod("script.list", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, auto&) + { + return s.handleFileWatcherFileListRequest(); + })); + + script_connection->registerAsyncMethod("object.unpublish", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectUnpublish(connection_id, params); + })); + + // Async methods (dispatched to the main thread inside a coroutine). + script_connection->registerAsyncMethod("script.unsubscribe", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleScriptUnsubscribe(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.request", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectRequest(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.content.get", + bindHandler([](LLScriptEditorWSServer& s, const std::string& method, const LLSD& id, const LLSD& params) + { + return s.handleObjectContentGet(method, id, params); + })); + + script_connection->registerAsyncMethod("object.content.save", + bindHandler([](LLScriptEditorWSServer& s, const std::string& method, const LLSD& id, const LLSD& params) + { + return s.handleObjectContentSave(method, id, params); + })); + + script_connection->registerAsyncMethod("object.item.delete", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectItemDelete(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.item.create", + bindHandler([](LLScriptEditorWSServer& s, const std::string& method, const LLSD& id, const LLSD& params) + { + return s.handleObjectItemCreate(method, id, params); + })); + + script_connection->registerAsyncMethod("object.list", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, auto&) + { + return s.handleObjectList(); + })); + + script_connection->registerAsyncMethod("object.script.set_running", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectScriptSetRunning(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.script.reset", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectScriptReset(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.modify", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectModify(connection_id, params); + })); + + script_connection->registerAsyncMethod("object.item.modify", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleObjectItemModify(connection_id, params); + })); + + script_connection->registerAsyncMethod("command.execute", + bindHandler([connection_id](LLScriptEditorWSServer& s, auto&, auto&, const LLSD& params) + { + return s.handleCommandExecute(connection_id, params); + })); + + script_connection->registerMethod("command.list", + bindHandler([](LLScriptEditorWSServer& s, auto&, auto&, auto&) + { + return s.handleCommandList(); + })); + } +} + +LLSD LLScriptEditorWSServer::handleObjectList() const +{ + LLSD response; + response["objects"] = mPublishedObjectManager.buildObjectListLLSD(); + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectScriptSetRunning(U32 connection_id, const LLSD& params) +{ + LLUUID prim_id = params["prim_id"].asUUID(); + LLUUID item_id = params["item_id"].asUUID(); + bool running = params["running"].asBoolean(); + + if (prim_id.isNull() || item_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("prim_id and item_id are required"); + + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + throw LLJSONRPCConnection::InvalidParams("Prim not found"); + + LLViewerObject* root = prim->getRootEdit(); + if (!root || !isObjectPublished(root->getID())) + throw LLJSONRPCConnection::ForbiddenError("Object is not published"); + + LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(prim->getInventoryObject(item_id)); + if (!item) + throw LLJSONRPCConnection::InvalidParams("Script not found in prim inventory"); + + if (item->getType() != LLAssetType::AT_LSL_TEXT) + throw LLJSONRPCConnection::InvalidParams("Item is not a script"); + + if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) + throw LLJSONRPCConnection::ForbiddenError("No modify permission on script"); + + // Send SetScriptRunning message to simulator + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_SetScriptRunning); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Script); + msg->addUUIDFast(_PREHASH_ObjectID, prim_id); + msg->addUUIDFast(_PREHASH_ItemID, item_id); + msg->addBOOLFast(_PREHASH_Running, running); + msg->sendReliable(prim->getRegion()->getHost()); + + LLSD response; + response["success"] = true; + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectScriptReset(U32 connection_id, const LLSD& params) +{ + LLUUID prim_id = params["prim_id"].asUUID(); + LLUUID item_id = params["item_id"].asUUID(); + + if (prim_id.isNull() || item_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("prim_id and item_id are required"); + + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + throw LLJSONRPCConnection::InvalidParams("Prim not found"); + + LLViewerObject* root = prim->getRootEdit(); + if (!root || !isObjectPublished(root->getID())) + throw LLJSONRPCConnection::ForbiddenError("Object is not published"); + + LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(prim->getInventoryObject(item_id)); + if (!item) + throw LLJSONRPCConnection::InvalidParams("Script not found in prim inventory"); + + if (item->getType() != LLAssetType::AT_LSL_TEXT) + throw LLJSONRPCConnection::InvalidParams("Item is not a script"); + + if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) + throw LLJSONRPCConnection::ForbiddenError("No modify permission on script"); + + // Send ScriptReset message to simulator + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ScriptReset); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Script); + msg->addUUIDFast(_PREHASH_ObjectID, prim_id); + msg->addUUIDFast(_PREHASH_ItemID, item_id); + msg->sendReliable(prim->getRegion()->getHost()); + + LLSD response; + response["success"] = true; + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectModify(U32 connection_id, const LLSD& params) +{ + // Step 1: Parameter Validation + LLUUID prim_id = params["prim_id"].asUUID(); + if (prim_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("prim_id is required"); + + bool has_name = params.has("name"); + bool has_desc = params.has("description"); + bool has_perms = params.has("permissions") && params["permissions"].has("next_owner"); + + if (!has_name && !has_desc && !has_perms) + throw LLJSONRPCConnection::InvalidParams( + "At least one property (name, description, or permissions) must be specified"); + + // Step 2: Find and Validate Object + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + throw LLJSONRPCConnection::InvalidParams("Prim not found"); + + LLViewerObject* root = prim->getRootEdit(); + if (!root || !isObjectPublished(root->getID())) + throw LLJSONRPCConnection::ForbiddenError("Object is not published"); + + if (!prim->permModify()) + throw LLJSONRPCConnection::ForbiddenError("No modify permission on object"); + + // Step 3: Send Property Update Messages + LLMessageSystem* msg = gMessageSystem; + LLHost host = prim->getRegion()->getHost(); + U32 local_id = prim->getLocalID(); + + if (has_name) + { + std::string new_name = params["name"].asString(); + msg->newMessageFast(_PREHASH_ObjectName); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addU32Fast(_PREHASH_LocalID, local_id); + msg->addStringFast(_PREHASH_Name, new_name); + msg->sendReliable(host); + } + + if (has_desc) + { + std::string new_desc = params["description"].asString(); + msg->newMessageFast(_PREHASH_ObjectDescription); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addU32Fast(_PREHASH_LocalID, local_id); + msg->addStringFast(_PREHASH_Description, new_desc); + msg->sendReliable(host); + } + + if (has_perms) + { + U32 next_owner_mask = static_cast<U32>(params["permissions"]["next_owner"].asInteger()); + msg->newMessageFast(_PREHASH_ObjectPermissions); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_HeaderData); + msg->addBOOLFast(_PREHASH_Override, false); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addU32Fast(_PREHASH_ObjectLocalID, local_id); + msg->addU8Fast(_PREHASH_Field, PERM_NEXT_OWNER); + msg->addBOOLFast(_PREHASH_Set, true); + msg->addU32Fast(_PREHASH_Mask, next_owner_mask); + msg->sendReliable(host); + } + + // Step 4: Return Success Response + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id.asString(); + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectItemModify(U32 connection_id, const LLSD& params) +{ + // Step 1: Parameter Validation + if (!params.has("prim_id") || !params.has("item_id")) + throw LLJSONRPCConnection::InvalidParams("prim_id and item_id are required"); + + bool has_name = params.has("name"); + bool has_desc = params.has("description"); + bool has_perms = params.has("permissions") && params["permissions"].has("next_owner"); + + if (!has_name && !has_desc && !has_perms) + throw LLJSONRPCConnection::InvalidParams( + "At least one property (name, description, or permissions) must be specified"); + + // Step 2: Validate Published Item (reuse existing helper) + ValidatedItem v = validatePublishedItem(params, PERM_MODIFY); + + LLUUID prim_id = params["prim_id"].asUUID(); + LLUUID item_id = params["item_id"].asUUID(); + + // Step 3: Create Modified Item Copy + LLPointer<LLViewerInventoryItem> new_item = + new LLViewerInventoryItem(static_cast<LLViewerInventoryItem*>(v.item)); + + if (has_name) + { + new_item->rename(params["name"].asString()); + } + + if (has_desc) + { + new_item->setDescription(params["description"].asString()); + } + + if (has_perms) + { + LLPermissions perm = new_item->getPermissions(); + U32 next_owner_mask = static_cast<U32>(params["permissions"]["next_owner"].asInteger()); + perm.setMaskNext(next_owner_mask); + new_item->setPermissions(perm); + } + + // Step 4: Send UpdateTaskInventory Message + v.prim->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, false); + + // Step 5: Return Success Response + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id.asString(); + response["item_id"] = item_id.asString(); + return response; +} + +void LLScriptEditorWSServer::registerCommand(const WSCommandInfo& info, WSCommandHandler handler) +{ + mCommandRegistry.emplace(info.command, std::make_pair(info, std::move(handler))); +} + +bool LLScriptEditorWSConnection::hasFeature(const std::string& feature) const +{ + return mFeatures.count(feature) > 0; +} + +LLSD LLScriptEditorWSServer::handleSaveBackToObjectContents(U32 connection_id, const LLSD& params) +{ + LLUUID object_id = params["object_id"].asUUID(); + if (object_id.isNull()) + { + throw LLJSONRPCConnection::InvalidParams("object_id is required"); + } + + const LLPublishedObjectMgr::PublishedObjectInfo* published_info = + mPublishedObjectManager.getPublished(object_id); + if (!published_info) + { + throw LLJSONRPCConnection::InvalidParams( + "Object is not published"); + } + + if (!published_info->mCanSaveBackToContents || published_info->mSourceTaskID.isNull()) + { + throw LLJSONRPCConnection::ForbiddenError( + "Save back is not available for this object"); + } + + LLViewerObject* root = gObjectList.findObject(object_id); + if (!root) + { + throw LLJSONRPCConnection::InvalidParams( + "object_id not found"); + } + + if (!save_object_back_to_contents(root, published_info->mSourceTaskID)) + { + throw LLJSONRPCConnection::InternalError( + "Failed to save object back to contents"); + } + + LL_DEBUGS("ScriptEditorWS") << "Save-back requested via command for object " + << object_id << " on connection " << connection_id << LL_ENDL; + + LLSD response; + response["success"] = true; + + LLSD result; + result["object_id"] = object_id; + response["result"] = result; + return response; +} + +LLSD LLScriptEditorWSServer::handleCommandExecute(U32 connection_id, const LLSD& params) +{ + const std::string command = params["command"].asString(); + if (command.empty()) + { + throw LLJSONRPCConnection::InvalidParams("command is required"); + } + + auto it = mCommandRegistry.find(command); + if (it == mCommandRegistry.end()) + { + throw LLJSONRPCConnection::InvalidParams( + "Unknown command: " + command); + } + + return it->second.second(connection_id, params["params"]); +} + +LLSD LLScriptEditorWSServer::handleCommandList() +{ + LLSD commands(LLSD::emptyArray()); + for (const auto& [name, entry] : mCommandRegistry) + { + LLSD info; + info["command"] = entry.first.command; + info["description"] = entry.first.description; + commands.append(info); + } + LLSD response; + response["commands"] = commands; + return response; +} + +void LLScriptEditorWSServer::sendCommandExecute( + U32 connection_id, const std::string& command, const LLSD& params) +{ + auto it = mActiveConnections.find(connection_id); + if (it == mActiveConnections.end()) + { + return; + } + + auto connection = it->second.lock(); + if (!connection || !connection->hasFeature("commands")) + { + return; + } + + LLSD call_params; + call_params["command"] = command; + call_params["params"] = params; + + connection->call("command.execute", call_params, + [command](const LLSD& result, const LLSD& error) + { + LL_WARNS_IF(!error.isUndefined() || !result["success"].asBoolean(), "WSCommand") + << "command.execute failed for " << command << LL_ENDL; + }); +} + +void LLScriptEditorWSServer::broadcastLanguageChange() +{ + LLUUID syntax_id = LLSyntaxDefCache::instance().getSyntaxID(); + + if (syntax_id != mLastSyntaxId) + { + mLastSyntaxId = syntax_id; + LLSD params; + params["id"] = syntax_id; + + if (isRunning()) + { + broadcastNotification("language.syntax.change", params); + } + } +} + +LLSD LLScriptEditorWSServer::handleLanguageIdRequest() const +{ + LLSD response; + + response["id"] = mLastSyntaxId; + return response; +} + +LLSD LLScriptEditorWSServer::handleSyntaxRequest(const LLSD& params) const +{ + LLSD response(LLSD::emptyMap()); + std::string category = params["kind"].asString(); + + if (category.empty()) + { + throw LLJSONRPCConnection::InvalidParams( + "No syntax category specified"); + } + + response["id"] = mLastSyntaxId; + if (category == "defs.lua") + { + response["defs"] = LLSyntaxDefCache::instance().getLuaKeywords(); + } + else if (category == "defs.lsl") + { + response["defs"] = LLSyntaxDefCache::instance().getLSLKeywords(); + } + else + { + throw LLJSONRPCConnection::InvalidParams( + "Unknown syntax category requested"); + } + + if (!response["defs"].isDefined()) + { + throw LLJSONRPCConnection::InternalError( + "Syntax definitions are unavailable"); + } + + response["success"] = true; + return response; +} + +LLSD LLScriptEditorWSServer::handleSyntaxCacheRequest() const +{ + LLSD response; + // Add array of cached syntax definition files + LLSD syntax_files = LLSD::emptyArray(); + for (const auto& name : LLSyntaxDefCache::instance().getCacheFileNames()) + { + syntax_files.append(name); + } + response["files"] = syntax_files; + response["success"] = true; + return response; +} + +LLSD LLScriptEditorWSServer::handleSyntaxCacheFileRequest(const LLSD& params) const +{ + std::string filename = params["filename"].asString(); + bool as_json = params["as_json"].asBoolean(); + + LLSyntaxDefCache& cache = LLSyntaxDefCache::instance(); + LLSD response; + + if (filename.empty()) + { + throw LLJSONRPCConnection::InvalidParams( + "No filename specified"); + } + if (!cache.hasCacheFile(filename)) + { + throw LLJSONRPCConnection::InvalidParams( + "Requested syntax cache file not found"); + } + if (as_json) + { + LLSD file_content = cache.loadCacheFileAsLLSD(filename); + if (file_content.isDefined()) + { + response["content"] = file_content; + } + else + { + throw LLJSONRPCConnection::InternalError( + "Failed to load and format syntax cache file."); + } + } + else + { + std::string content = cache.loadCacheFile(filename); + if (!content.empty()) + { + response["content"] = content; + } + else + { + throw LLJSONRPCConnection::InternalError( + "Failed to load syntax cache file"); + } + } + response["success"] = true; + return response; +} + +LLSD LLScriptEditorWSServer::handleScriptSubscribe(U32 connection_id, const LLSD& params) +{ + LLSD response(LLSD::emptyMap()); + + std::string script_id = params["script_id"].asString(); + std::string script_name = params["script_name"].asString(); + std::string language = params["script_language"].asString(); + + SubscriptionError result = updateScriptSubscription(script_id, connection_id); + + response["script_id"] = script_id; + response["success"] = (result == SubscriptionError::SUCCESS); + response["status"] = static_cast<S32>(result); + + LL_WARNS_IF(result != SubscriptionError::SUCCESS, "ScriptEditorWS") + << "Script connect request for script " << script_id << " failed with status " << static_cast<S32>(result) << LL_ENDL; + switch (result) + { + case SubscriptionError::SUCCESS: + response["message"] = "OK"; + break; + case SubscriptionError::INVALID_EDITOR: + response["message"] = "Invalid editor handle"; + break; + case SubscriptionError::INVALID_SUBSCRIPTION: + response["message"] = "No subscription found for script"; + break; + case SubscriptionError::ALREADY_SUBSCRIBED: + response["message"] = "Script already subscribed"; + break; + case SubscriptionError::INTERNAL_ERROR: + response["message"] = "Internal server error"; + break; + } + + if (result == SubscriptionError::SUCCESS) + { + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end()) + { + LLUUID prim_id = (*it).second.mItemRef.mPrimID; + LLUUID root_id = prim_id; + LLViewerObject* object = gObjectList.findObject(prim_id); + if (object) + { + LLViewerObject* root = object->getRootEdit(); + if (root) + { + root_id = root->getID(); + } + } + + response["object_id"] = prim_id; + response["root_id"] = root_id; + //response["object_name"] = object ? object->getName() : "Unknown"; + response["item_id"] = (*it).second.mItemRef.mItemID; + } + } + + return response; +} + +LLSD LLScriptEditorWSServer::handleScriptUnsubscribe(U32 connection_id, const LLSD& params) +{ + std::string script_id = params["script_id"].asString(); + + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end() && (it->second.mConnectionID == connection_id)) + { + unsubscribeEditor(script_id); + } + return LLSD(); +} + +LLSD LLScriptEditorWSServer::handleFileWatcherFileListRequest() const +{ + LLSD response; + + response["temp_dir"] = LLFile::tmpdir(); + + // Add array of script_id's from active scripts + LLSD script_ids_array = LLSD::emptyArray(); + for (const auto& [script_id, subinfo] : mSubscriptions) + { + script_ids_array.append(script_id); + } + response["script_ids"] = script_ids_array; + + response["success"] = true; + + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectRequest(U32 connection_id, const LLSD& params) +{ + LLUUID object_id = params["object_id"].asUUID(); + LLSD response; + + if (object_id.isNull()) + { + throw LLJSONRPCConnection::InvalidParams( + "No object_id specified"); + } + + LLViewerObject* object = gObjectList.findObject(object_id); + if (!object) + { + throw LLJSONRPCConnection::InvalidParams( + "Object not found"); + } + + if (!object->permModify()) + { + throw LLJSONRPCConnection::ForbiddenError( + "Permission denied"); + } + + bool accepted = publishObject(object_id); + if (!accepted) + { + throw LLJSONRPCConnection::InternalError( + "Failed to initiate publish"); + } + + response["success"] = true; + return response; +} + +// Helper function to validate that the specified prim and +// item are valid, published, and have the required permissions. +// Throws JSON-RPC exceptions if validation fails. +LLScriptEditorWSServer::ValidatedItem LLScriptEditorWSServer::validatePublishedItem( + const LLSD& params, U32 permMask) const +{ + LLUUID prim_id = params["prim_id"].asUUID(); + LLUUID item_id = params["item_id"].asUUID(); + + if (prim_id.isNull() || item_id.isNull()) + throw LLJSONRPCConnection::InvalidParams("prim_id and item_id are required"); + + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + throw LLJSONRPCConnection::InvalidParams("Prim not found"); + + LLViewerObject* root = prim->getRootEdit(); + if (!root || !isObjectPublished(root->getID())) + throw LLJSONRPCConnection::ForbiddenError("Object is not published"); + + LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(prim->getInventoryObject(item_id)); + if (!item) + throw LLJSONRPCConnection::InvalidParams("Item not found in prim inventory"); + + LLAssetType::EType type = item->getType(); + if (type != LLAssetType::AT_LSL_TEXT && type != LLAssetType::AT_NOTECARD) + throw LLJSONRPCConnection::InvalidParams("Item is not a script or notecard"); + + if ((permMask & PERM_COPY) && + !gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE)) + throw LLJSONRPCConnection::ForbiddenError("Insufficient permissions"); + + if (permMask & PERM_MODIFY) + { + // Writes into task inventory require modify permission on both the + // item AND the containing prim. A no-mod object can be published + // (read-only), but its contents cannot be changed. + if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) + throw LLJSONRPCConnection::ForbiddenError("Insufficient permissions"); + + if (!prim->permModify()) + throw LLJSONRPCConnection::ForbiddenError("No modify permission on object"); + } + + return { prim, root, item, type }; +} + +LLSD LLScriptEditorWSServer::handleObjectContentGet(const std::string& method, const LLSD& id, const LLSD& params) +{ + // Permission policy for reading item contents: + // - Scripts: require both PERM_COPY and PERM_MODIFY. No-copy or + // no-modify scripts cannot have their source exposed. + // - Notecards: no permission requirement -- no-mod notecards remain + // readable so external editors can view their contents. + U32 required_perms = 0; + { + LLUUID prim_id_peek = params["prim_id"].asUUID(); + LLUUID item_id_peek = params["item_id"].asUUID(); + LLViewerObject* prim_peek = gObjectList.findObject(prim_id_peek); + if (prim_peek) + { + if (auto* it = dynamic_cast<LLInventoryItem*>(prim_peek->getInventoryObject(item_id_peek))) + { + if (it->getType() == LLAssetType::AT_LSL_TEXT) + required_perms = PERM_COPY | PERM_MODIFY; + } + } + } + + auto v = validatePublishedItem(params, required_perms); + + LLUUID prim_id = params["prim_id"].asUUID(); + LLUUID item_id = params["item_id"].asUUID(); + + LLSD cb_result = await_async_result( + "objectContentGet", ASSET_FETCH_TIMEOUT, "Asset fetch timed out", + [&](const std::string& pump_name) + { + gAssetStorage->getInvItemAsset( + v.prim->getRegion()->getHost(), + gAgent.getID(), + gAgent.getSessionID(), + v.item->getPermissions().getOwner(), + v.prim->getID(), + v.item->getUUID(), + v.item->getAssetUUID(), + v.type, + [pump_name](const LLUUID& asset_uuid, LLAssetType::EType asset_type, void*, S32 status, LLExtStat) + { + LLSD result; + if (status == LL_ERR_NOERR) + { + result["asset_uuid"] = asset_uuid; + result["asset_type"] = static_cast<S32>(asset_type); + } + else + { + result["error"] = status; + } + LLEventPumps::instance().post(pump_name, result); + }, + nullptr, + true); + }); + + if (cb_result.has("error")) + { + S32 status = cb_result["error"].asInteger(); + if (status == LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE || status == LL_ERR_FILE_EMPTY) + throw LLJSONRPCConnection::InvalidParams("Asset not found"); + if (status == LL_ERR_INSUFFICIENT_PERMISSIONS) + throw LLJSONRPCConnection::ForbiddenError("Insufficient permissions to read asset"); + throw LLJSONRPCConnection::InternalError("Asset fetch failed: " + std::to_string(status)); + } + + LLUUID asset_uuid = cb_result["asset_uuid"].asUUID(); + LLAssetType::EType asset_type = static_cast<LLAssetType::EType>(cb_result["asset_type"].asInteger()); + + LLFileSystem file(asset_uuid, asset_type); + S32 file_length = file.getSize(); + if (file_length <= 0) + throw LLJSONRPCConnection::InternalError("Asset file empty or not found in cache"); + + std::vector<char> buffer(file_length + 1); + file.read(reinterpret_cast<U8*>(buffer.data()), file_length); + buffer[file_length] = '\0'; + + std::string text_content; + if (asset_type == LLAssetType::AT_NOTECARD) + { + // Notecards are stored in an envelope format -- use LLNotecard to extract the text + LLNotecard notecard; + std::istringstream istr(std::string(buffer.data(), file_length)); + if (notecard.importStream(istr)) + { + text_content = notecard.getText(); + } + else + { + throw LLJSONRPCConnection::InternalError("Failed to parse notecard format"); + } + } + else + { + text_content = std::string(buffer.data()); + } + + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id; + response["item_id"] = item_id; + response["content"] = text_content; + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectContentSave(const std::string& method, const LLSD& id, const LLSD& params) +{ + std::string content = params["content"].asString(); + if (content.empty()) + throw LLJSONRPCConnection::InvalidParams("content is required"); + + auto v = validatePublishedItem(params, PERM_MODIFY); + + if (v.type == LLAssetType::AT_LSL_TEXT) + { + return saveScript(v.prim, v.item, content, params); + } + else + { + return saveNotecard(v.prim, v.item, content); + } +} + +LLSD LLScriptEditorWSServer::saveScript(LLViewerObject* prim, LLInventoryItem* item, + const std::string& content, const LLSD& params) +{ + // Determine compile target + std::string compile_target; + if (params.has("vm")) + { + compile_target = params["vm"].asString(); + // The client sends "luau" for the Luau VM -- but if the script is LSL + // (not native Luau), the internal compile target is "lsl-luau". + if (compile_target == "luau" && item->getInventorySubType() != SST_LUA) + { + compile_target = "lsl-luau"; + } + } + else + { + U8 subtype = item->getInventorySubType(); + std::string runtime = item->getRuntime(); + bool is_lua = (subtype == SST_LUA); + if (!is_lua && runtime == "luau") + compile_target = "lsl-luau"; + else if (!runtime.empty()) + compile_target = runtime; + else + { + is_lua = is_lua_script(content); + compile_target = is_lua ? "luau" : "mono"; + } + } + + // The task inventory can be refreshed while the upload is in flight, + // invalidating the raw item pointer returned by validatePublishedItem(). + // Keep stable identifiers for use after await_async_result(). + const LLUUID prim_id = prim->getID(); + const LLUUID item_id = item->getUUID(); + + std::string url = prim->getRegion()->getCapability("UpdateScriptTask"); + if (url.empty()) + throw LLJSONRPCConnection::InternalError("UpdateScriptTask capability not available"); + + LLSD cb_result = await_async_result( + "objectContentSave", SCRIPT_UPLOAD_TIMEOUT, "Script upload/compile timed out", + [&, prim_id, item_id](const std::string& pump_name) + { + auto [on_success, on_failure] = make_asset_upload_callbacks(pump_name); + bool is_running = params.has("running") ? params["running"].asBoolean() : false; + LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLScriptAssetUpload>( + prim_id, item_id, + compile_target, is_running, LLUUID::null, content, + std::move(on_success), std::move(on_failure))); + LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo); + }); + + if (cb_result.has("failed")) + throw LLJSONRPCConnection::InternalError("Upload failed: " + cb_result["reason"].asString()); + + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id; + response["item_id"] = item_id; + response["compiled"] = cb_result["compiled"]; + if (!cb_result["compiled"].asBoolean() && cb_result.has("errors")) + { + response["diagnostics"] = LLSD::emptyArray(); + + const bool is_lua = + compile_target == "luau" || + compile_target == "lsl-luau"; + + for (const auto& error : llsd::inArray(cb_result["errors"])) + { + boost::smatch match; + LLSD diagnostic; + diagnostic["level"] = "ERROR"; + + if (is_lua && + boost::regex_match( + error.asString(), + match, + LUAU_LOCATION_PATTERN)) + { + diagnostic["row"] = std::stoi(match[2].str()); + diagnostic["column"] = 0; + diagnostic["message"] = match[3].str(); + } + else if (!is_lua && + boost::regex_match( + error.asString(), + match, + LSL_LOCATION_PATTERN)) + { + diagnostic["row"] = + std::stoi(match[1].str()) + 1; + diagnostic["column"] = + std::stoi(match[2].str()) + 1; + diagnostic["level"] = match[3].str(); + diagnostic["message"] = match[4].str(); + diagnostic["format"] = "lsl"; + } + else + { + diagnostic["row"] = 0; + diagnostic["column"] = 0; + diagnostic["message"] = error.asString(); + } + + response["diagnostics"].append(diagnostic); + } + } + + // If the script is open in the viewer's editor, update it + LLSD floater_key; + floater_key["taskid"] = prim_id; + floater_key["itemid"] = item_id; + LLLiveLSLEditor* editor = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key); + if (editor) + { + LLScriptEdCore* sed = editor->getScriptEdCore(); + if (sed) + { + sed->setScriptText(LLStringExplicit(content), true); + sed->makeEditorPristine(); + } + } + + return response; +} + +LLSD LLScriptEditorWSServer::saveNotecard(LLViewerObject* prim, LLInventoryItem* item, + const std::string& content) +{ + // The task inventory can be refreshed while the upload is in flight, + // invalidating the raw item pointer returned by validatePublishedItem(). + // Keep stable identifiers for use after await_async_result(). + const LLUUID prim_id = prim->getID(); + const LLUUID item_id = item->getUUID(); + + std::string url = prim->getRegion()->getCapability("UpdateNotecardTaskInventory"); + if (url.empty()) + throw LLJSONRPCConnection::InternalError("UpdateNotecardTaskInventory capability not available"); + + // Use LLNotecard to produce the proper notecard format + LLNotecard notecard; + notecard.setText(content); + + std::ostringstream ostr; + notecard.exportStream(ostr); + + LLSD cb_result = await_async_result( + "objectContentSaveNotecard", NOTECARD_UPLOAD_TIMEOUT, "Notecard upload timed out", + [&, prim_id, item_id](const std::string& pump_name) + { + auto [on_success, on_failure] = make_asset_upload_callbacks(pump_name); + LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLBufferedAssetUploadInfo>( + prim_id, item_id, + LLAssetType::AT_NOTECARD, ostr.str(), + std::move(on_success), std::move(on_failure))); + LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo); + }); + + if (cb_result.has("failed")) + throw LLJSONRPCConnection::InternalError("Upload failed: " + cb_result["reason"].asString()); + + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id; + response["item_id"] = item_id; + + // If the notecard is open in the viewer's editor, update it + LLSD floater_key; + floater_key["taskid"] = prim_id; + floater_key["itemid"] = item_id; + LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", floater_key); + if (nc) + { + LLViewerTextEditor* nc_editor = nc->getChild<LLViewerTextEditor>("Notecard Editor"); + if (nc_editor) + { + nc_editor->setText(content); + nc_editor->makePristine(); + } + } + + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectItemDelete(U32 connection_id, const LLSD& params) +{ + auto v = validatePublishedItem(params, PERM_MODIFY); + + const LLUUID prim_id = v.prim->getID(); + const LLUUID root_id = v.root->getID(); + const LLUUID item_id = v.item->getUUID(); + + // Optimistic local delete then emit immediate update + // for published clients and request authoritative server refresh. + v.prim->removeInventory(item_id); + onPrimInventoryChanged(root_id, prim_id); + + if (!mPublishedObjectManager.hasInventoryRequestStart(prim_id)) + { + v.prim->dirtyInventory(); + mPublishedObjectManager.setInventoryRequestStart( + prim_id, + LLTimer::getTotalSeconds().value()); + v.prim->requestInventory(); + } + + LLSD response; + response["success"] = true; + response["prim_id"] = prim_id; + response["item_id"] = item_id; + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectUnpublish(U32 connection_id, const LLSD& params) +{ + LLUUID object_id = params["object_id"].asUUID(); + if (object_id.isNull()) + { + throw LLJSONRPCConnection::InvalidParams("object_id is required"); + } + + if (!mPublishedObjectManager.hasPublished(object_id)) + { + throw LLJSONRPCConnection::InvalidParams("Object is not published"); + } + + unpublishObject(object_id, "manual"); + + LLSD response; + response["success"] = true; + response["object_id"] = object_id; + return response; +} + +LLSD LLScriptEditorWSServer::handleObjectItemCreate(const std::string& method, const LLSD& id, const LLSD& params) +{ + std::string type = params["type"].asString(); + if (type != "script" && type != "notecard") + { + throw LLJSONRPCConnection::InvalidParams("Unsupported item type: " + type); + } + + LLUUID prim_id = params["prim_id"].asUUID(); + if (prim_id.isNull()) + { + throw LLJSONRPCConnection::InvalidParams("prim_id is required"); + } + + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + { + throw LLJSONRPCConnection::InvalidParams("Prim not found"); + } + + LLViewerObject* root = prim->getRootEdit(); + if (!root || !isObjectPublished(root->getID())) + { + throw LLJSONRPCConnection::ForbiddenError("Object is not published"); + } + + std::string name = params["name"].asString(); + if (name.empty()) + { + throw LLJSONRPCConnection::InvalidParams("name is required"); + } + + bool has_cap = prim->getRegion() && !prim->getRegion()->getCapability("CreateTaskInventoryItem").empty(); + + if (type == "notecard" && !has_cap) + { + throw LLJSONRPCConnection::ForbiddenError("Notecard creation requires CreateTaskInventoryItem capability"); + } + + // Resolve type-specific fields + LLAssetType::EType asset_type; + LLInventoryType::EType inv_type; + U8 sub_type = 0; + const char* perm_key; + LLSD cap_params; + + if (type == "script") + { + std::string vm = params["vm"].asString(); + if (vm == "luau") + { + sub_type = SST_LUA; + } + else if (vm == "mono" || vm == "lsl2") + { + sub_type = SST_LSL; + } + else + { + throw LLJSONRPCConnection::InvalidParams("vm must be 'luau', 'mono', or 'lsl2'"); + } + + asset_type = LLAssetType::AT_LSL_TEXT; + inv_type = LLInventoryType::IT_LSL; + perm_key = "Scripts"; + cap_params["enabled"] = true; + cap_params["vm"] = vm; + } + else + { + asset_type = LLAssetType::AT_NOTECARD; + inv_type = LLInventoryType::IT_NOTECARD; + perm_key = "Notecards"; + if (params.has("text")) + { + cap_params["text"] = params["text"].asString(); + } + } + + LLPermissions perms; + perms.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); + perms.initMasks( + PERM_ALL, + PERM_ALL, + LLFloaterPerms::getEveryonePerms(perm_key), + LLFloaterPerms::getGroupPerms(perm_key), + PERM_MOVE | LLFloaterPerms::getNextOwnerPerms(perm_key)); + + std::string desc; + LLViewerAssetType::generateDescriptionFor(asset_type, desc); + + // Snapshot existing item IDs before creation + std::set<LLUUID> existing_items; + { + LLInventoryObject::object_list_t inv; + prim->getInventoryContents(inv); + for (auto& obj : inv) + { + existing_items.insert(obj->getUUID()); + } + } + + // Set up event pump to wait for inventory change + LLEventMailDrop result_pump("objectItemCreate." + LLUUID::generateNewID().asString(), true); + + // Reject if another item.create is already in flight for this prim; the + // map keys by prim, so two concurrent creates would clobber one another. + if (!mPublishedObjectManager.reservePendingItemCreate(prim_id, result_pump.getName())) + { + throw LLJSONRPCConnection::InvalidRequest( + "An item.create is already in flight for this prim"); + } + + // RAII: guarantee the pending entry is cleared on every exit path (throw + // or normal return), so no exception between here and the erase-on-post + // in onPrimInventoryChanged can leave a stale entry behind. Uses a + // shared_ptr custom deleter as a lightweight scope guard. + std::shared_ptr<void> pending_guard(nullptr, [this, prim_id](void*) + { + mPublishedObjectManager.clearPendingItemCreate(prim_id); + }); + + if (has_cap) + { + prim->createInventoryItem(asset_type, inv_type, sub_type, name, desc, perms, cap_params, + [pump_name = result_pump.getName()](bool success, const LLSD& response) + { + LLEventPumps::instance().obtain(pump_name).post(response); + }); + } + else + { + // Fallback: legacy RezScript UDP (scripts only -- notecards already rejected above) + LLPointer<LLViewerInventoryItem> new_item = + new LLViewerInventoryItem( + LLUUID::null, LLUUID::null, perms, LLUUID::null, + asset_type, inv_type, name, desc, LLSaleInfo::DEFAULT, + LLInventoryItemFlags::II_FLAGS_SUBTYPE_MASK & sub_type, + time_corrected()); + prim->saveScript(new_item, true, true, LLUUID::null); + } + + // Wait for inventory change callback + LLSD event = llcoro::suspendUntilEventOnWithTimeout(result_pump, ITEM_CREATE_TIMEOUT, LLSD().with("timeout", true)); + + if (event.has("timeout")) + { + throw LLJSONRPCConnection::RequestTimeoutError("Timed out waiting for item creation"); + } + + prim = gObjectList.findObject(prim_id); + if (!prim) + { + throw LLJSONRPCConnection::InternalError("Prim no longer exists"); + } + + LLSD response; + + // If cap returned item_id directly, use it + if (event.has("success") && event["success"].asBoolean() && + event.has("item_id") && event["item_id"].asUUID().notNull()) + { + response["item_id"] = event["item_id"]; + response["name"] = event["name"]; + response["description"] = desc; + response["type"] = type; + response["prim_id"] = prim_id; + + if (type == "script") + { + response["subtype"] = static_cast<S32>(sub_type); + } + + LLSD perm_entry; + perm_entry["owner"] = static_cast<S32>(perms.getMaskOwner()); + perm_entry["next_owner"] = static_cast<S32>(perms.getMaskNextOwner()); + response["permissions"] = perm_entry; + response["creator_id"] = gAgent.getID(); + } + else + { + // Fallback: search inventory (for UDP path or if cap didn't return item_id) + LLInventoryObject::object_list_t inv; + prim->getInventoryContents(inv); + for (auto& obj : inv) + { + if (existing_items.find(obj->getUUID()) == existing_items.end()) + { + LLInventoryItem* created = dynamic_cast<LLInventoryItem*>(obj.get()); + if (created && created->getType() == asset_type) + { + response["item_id"] = created->getUUID(); + response["name"] = created->getName(); + response["description"] = created->getDescription(); + response["type"] = type; + + if (type == "script") + { + response["subtype"] = static_cast<S32>(created->getInventorySubType()); + const std::string& runtime = created->getRuntime(); + if (!runtime.empty()) + { + response["vm"] = runtime; + } + } + + const LLPermissions& item_perms = created->getPermissions(); + LLSD perm_entry; + perm_entry["owner"] = static_cast<S32>(item_perms.getMaskOwner()); + perm_entry["next_owner"] = static_cast<S32>(item_perms.getMaskNextOwner()); + response["permissions"] = perm_entry; + response["creator_id"] = item_perms.getCreator(); + response["prim_id"] = prim_id; + break; + } + } + } + } + + if (!response.has("item_id")) + { + throw LLJSONRPCConnection::InternalError("Item was not found in updated inventory"); + } + + return response; +} + + +void LLScriptEditorWSServer::notifyScript(const std::string& script_id, const std::string &method, const LLSD& message) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + auto it = mSubscriptions.find(script_id); + if (it != mSubscriptions.end()) + { + auto connection = it->second.mConnection.lock(); + if (connection) + { + connection->notify(method, message); + } + } +} + + +void LLScriptEditorWSServer::sendUnsubscribeScriptEditor(const std::string& script_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLSD params; + params["script_id"] = script_id; + + notifyScript(script_id, "script.unsubscribe", params); +} + +void LLScriptEditorWSServer::sendCompileResults(const std::string &script_id, const LLSD &results) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLHandle<LLPanel> editor_handle = findEditorForScript(script_id); + if (editor_handle.isDead()) + { + return; + } + LLScriptEdContainer* editor = dynamic_cast<LLScriptEdContainer*>(editor_handle.get()); + if (!editor) + { + return; + } + LLScriptEdCore* core = editor->getScriptEdCore(); + bool is_lua = core && (core->isLuauLanguage()); + + LLSD params; + params["script_id"] = script_id; + params["success"] = results["compiled"].asBoolean(); + params["running"] = results["is_running"].asBoolean(); + if (results.has("errors")) + { + params["diagnostics"] = LLSD::emptyArray(); + + if (is_lua) + { // lua errors: ":line: message", line is 1-based + for (const auto& err : llsd::inArray(results["errors"])) + { + boost::smatch match; + LLSD err_entry; + + err_entry["column"] = 0; // TODO: Lua compiler does not provide column info + err_entry["level"] = "ERROR"; + + if (boost::regex_match(err.asString(), match, LUAU_LOCATION_PATTERN)) + { + S32 line_number = std::stoi(match[2].str()); + std::string message = match[3].str(); + + err_entry["row"] = line_number; + err_entry["message"] = message; + } + else + { + err_entry["row"] = 0; + err_entry["message"] = err.asString(); + } + params["diagnostics"].append(err_entry); + } + } + else + { // lsl errors: "(line, column) : SEVERITY : message", line and column are 0-based + for (const auto& err : llsd::inArray(results["errors"])) + { + boost::smatch match; + LLSD err_entry; + + if (boost::regex_match(err.asString(), match, LSL_LOCATION_PATTERN)) + { + S32 line_number = std::stoi(match[1].str()); + S32 col_number = std::stoi(match[2].str()); + std::string severity = match[3].str(); + std::string message = match[4].str(); + + err_entry["row"] = line_number + 1; + err_entry["column"] = col_number + 1; + err_entry["level"] = severity; + err_entry["message"] = message; + err_entry["format"] = "lsl"; + } + else + { + err_entry["row"] = 0; + err_entry["column"] = 0; + err_entry["level"] = "ERROR"; + err_entry["message"] = err.asString(); + err_entry["format"] = "lsl"; + } + params["diagnostics"].append(err_entry); + } + } + } + + notifyScript(script_id, "script.compiled", params); +} + +void LLScriptEditorWSServer::forwardChatToIDE( + const LLChat& chat_msg, + LLPublishedObjectMgr::RuntimeEventAggregator::Channel channel) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + + mPublishedObjectManager.ingestRuntimeChat(chat_msg, channel); +} + +void LLScriptEditorWSServer::sendRuntimeEvent( + const LLPublishedObjectMgr::RuntimeChatEvent& event) const +{ + + std::string script_id; + if (event.mItemID.notNull()) + { + script_id = buildScriptSubscriptionId(event.mPrimID, event.mItemID); + } + + if (!isObjectPublished(event.mRootID) && + (script_id.empty() || mSubscriptions.find(script_id) == mSubscriptions.end())) + { + return; + } + + LLSD message; + message["object_id"] = event.mRootID; + message["prim_id"] = event.mPrimID; + message["item_id"] = event.mItemID; + message["object_name"] = event.mObjectName; + message["message"] = event.mMessage; + + LLSD item; + item["root_id"] = event.mRootID; + item["prim_id"] = event.mPrimID; + item["item_id"] = event.mItemID; + item["name"] = event.mScriptName; + item["language"] = + event.mVM == LLPublishedObjectMgr::RuntimeEventAggregator::VM::LUAU + ? "luau" + : "lsl"; + message["item"] = item; + + switch (event.mChannel) + { + case LLPublishedObjectMgr::RuntimeEventAggregator::Channel::DEBUG: + message["channel"] = "debug"; + break; + case LLPublishedObjectMgr::RuntimeEventAggregator::Channel::OWNER_SAY: + message["channel"] = "owner_say"; + break; + } + + if (event.mIsError) + { + message["error"] = event.mError; + message["line"] = event.mLine; + message["column"] = event.mColumn; + message["stack"] = LLSD::emptyArray(); + for (const auto& line : event.mStack) + { + message["stack"].append(line); + } + } + + notifyAll(event.mIsError ? "runtime.error" : "runtime.debug", message); +} + +void LLScriptEditorWSServer::notifyConnection(U32 connection_id, const std::string& method, const LLSD& params) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + auto it = mActiveConnections.find(connection_id); + if (it != mActiveConnections.end()) + { + auto connection = it->second.lock(); + if (connection) + { + connection->notify(method, params); + } + } +} + +void LLScriptEditorWSServer::notifyAll(const std::string& method, const LLSD& params) const +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + // Serialize once, deliver many: build the JSON-RPC envelope and its wire + // string a single time, then hand the bytes to each connection. + LLSD envelope = LLJSONRPCConnection::makeEnvelope( + LLSD(), method, params, LLSD(), LLSD()); + std::string payload = boost::json::serialize(LlsdToJson(envelope)); + + + for (const auto& pair : mActiveConnections) + { + auto connection = pair.second.lock(); + if (connection) + { + connection->sendMessage(payload); + } + } +} + + +// static +std::string LLScriptEditorWSServer::getPrimName(LLViewerObject* obj) +{ + std::string name = nv_string(obj, "Name"); + if (!name.empty()) + { + return name; + } + + if (!obj) + { + return std::string(); + } + + LLSelectNode* node = LLSelectMgr::instance().getSelection()->findNode(obj); + if (node && !node->mName.empty()) + { + return node->mName; + } + + // Never emit an empty prim/object name to downstream tooling. + return obj->getID().asString(); +} + +bool LLScriptEditorWSServer::publishObject(const LLUUID& object_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLViewerObject* root = gObjectList.findObject(object_id); + if (!root) + { + LL_WARNS("ScriptEditorWS") << "publishObject: object not found: " << object_id << LL_ENDL; + return false; + } + + if (!root->permModify()) + { + LL_WARNS("ScriptEditorWS") << "publishObject: no modify permission on object: " << object_id << LL_ENDL; + return false; + } + + // If already published, unpublish first to replace cleanly + if (isObjectPublished(object_id)) + { + unpublishObject(object_id, "republish"); + } + + // Collect root + all children + std::vector<LLViewerObject*> prims = collect_linkset(root); + + // Request object properties for each prim in the linkset (root + children), + // matching the hover path so name/description metadata is refreshed. + for (LLViewerObject* prim : prims) + { + LLSelectMgr::instance().requestObjectPropertiesFamily(prim); + } + + // Set up a PendingPublish to coordinate inventory loading across all prims. + // We register a listener and call requestInventory() on every prim. + // If inventory is already loaded, requestInventory() fires the callback + // synchronously via doInventoryCallback(), so all_ready will naturally + // become true before this function returns in the common case. + mPublishedObjectManager.beginPendingPublish(object_id, prims); + + // Request inventory for each prim. If already loaded, onPrimInventoryReady() + // will be called immediately (possibly building and sending the publish + // before this loop even finishes). + for (LLViewerObject* prim : prims) + { + if (!mPublishedObjectManager.hasPendingPublish(object_id)) + { + break; // publish completed synchronously during a previous iteration + } + mPublishedObjectManager.setInventoryRequestStart(prim->getID(), LLTimer::getTotalSeconds().value()); + prim->requestInventory(); + } + + return true; +} + +bool LLScriptEditorWSServer::isObjectPublished(const LLUUID& object_id) const +{ + return mPublishedObjectManager.hasPublished(object_id); +} + +void LLScriptEditorWSServer::onPrimInventoryReady(const LLUUID& object_id, const LLUUID& prim_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (mPublishedObjectManager.handlePrimInventoryReadyEvent(object_id, prim_id)) + { + LL_DEBUGS("ScriptEditorWS") << "All prim inventories ready for object " << object_id << LL_ENDL; + buildAndSendPublish(object_id); + } +} + +void LLScriptEditorWSServer::buildAndSendPublish(const LLUUID& object_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (!mPublishedObjectManager.hasPendingPublish(object_id)) + { + LL_WARNS("ScriptEditorWS") << "buildAndSendPublish: no pending publish for " << object_id << LL_ENDL; + return; + } + + LLViewerObject* root = gObjectList.findObject(object_id); + if (!root) + { + LL_WARNS("ScriptEditorWS") << "buildAndSendPublish: root object gone: " << object_id << LL_ENDL; + mPublishedObjectManager.cancelPendingPublish(object_id); + return; + } + + LLSD pub = mPublishedObjectManager.buildPublishedObjectLLSD(root); + + // Store in the published registry + LLPublishedObjectMgr::PublishedObjectInfo info; + info.mObjectID = root->getID(); + info.mOwnerID = root->mOwnerID; + info.mObjectName = pub["object_name"].asString(); + info.mObjectDescription = pub["object_description"].asString(); + if (root->getRegion()) + { + info.mRegionName = root->getRegion()->getName(); + } + LLSelectNode* root_select_node = LLSelectMgr::instance().getSelection()->findNode(root); + if (root_select_node + && root_select_node->mValid + && !root_select_node->mFromTaskID.isNull() + && !root->isAttachment()) + { + info.mCanSaveBackToContents = true; + info.mSourceTaskID = root_select_node->mFromTaskID; + } + else + { + info.mCanSaveBackToContents = false; + info.mSourceTaskID.setNull(); + } + + S32 link_num = 1; + std::vector<LLViewerObject*> prims = collect_linkset(root); + for (LLViewerObject* prim : prims) + { + LLPublishedObjectMgr::PublishedPrimInfo prim_info; + prim_info.mPrimID = prim->getID(); + prim_info.mPrimName = getPrimName(prim); // Use helper with selection fallback + prim_info.mLinkNumber = link_num++; + prim_info.mInventorySerial = static_cast<S16>(prim->getInventorySerial()); + info.mPrims.push_back(prim_info); + } + + LLPublishedObjectMgr::PublishedObjectInfo& published_info = mPublishedObjectManager.finalizePendingPublish(object_id, std::move(info)); + + // Align outgoing publish payload with any property responses that arrived + // while inventory-gated publish was still pending. + pub["object_name"] = published_info.mObjectName; + pub["can_save_back"] = published_info.mCanSaveBackToContents; + pub["object_description"] = published_info.mObjectDescription; + if (pub.has("linked_objects")) + { + LLSD& linked_objects = pub["linked_objects"]; + for (S32 i = 0; i < linked_objects.size(); ++i) + { + const LLUUID link_id = linked_objects[i]["link_id"].asUUID(); + auto prim_it = std::find_if( + published_info.mPrims.begin(), + published_info.mPrims.end(), + [&](const LLPublishedObjectMgr::PublishedPrimInfo& p) + { + return p.mPrimID == link_id; + }); + if (prim_it != published_info.mPrims.end()) + { + linked_objects[i]["link_name"] = prim_it->mPrimName; + linked_objects[i]["link_description"] = prim_it->mPrimDescription; + } + } + } + + // Send notification + LLSD message; + message["object"] = pub; + notifyAll("object.publish", message); + + LL_INFOS("ScriptEditorWS") << "Published object " << object_id + << " (" << pub["object_name"].asString() << ") with " + << (prims.size() - 1) << " linked prim(s)" << LL_ENDL; + + // Re-request object properties now that the object is published so + // onObjectPropertyChanged can emit object.update for root and linked prims. + for (LLViewerObject* prim : prims) + { + LLSelectMgr::instance().requestObjectPropertiesFamily(prim); + } +} + +void LLScriptEditorWSServer::onLinksetChildAdded(const LLUUID& root_id, LLViewerObject* child) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (!child) + { + return; + } + + if (!mPublishedObjectManager.reconcileLinksetChildAdded( + root_id, + child, + LLTimer::getTotalSeconds().value())) + { + return; + } + + // Request inventory (async; fires onPrimInventoryChanged when ready). + child->requestInventory(); + + // Start safety-timeout timer (no-op if one is already pending for this root) + scheduleLinksetFlush(root_id, LINKSET_ADD_FLUSH_DELAY); +} + +void LLScriptEditorWSServer::onLinksetChildRemoved(const LLUUID& root_id, const LLUUID& child_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (!mPublishedObjectManager.reconcileLinksetChildRemoved(root_id, child_id)) + { + return; + } + + // Schedule coalesced flush - multiple simultaneous removes share one timer + scheduleLinksetFlush(root_id, LINKSET_REMOVE_FLUSH_DELAY); +} + +void LLScriptEditorWSServer::scheduleLinksetFlush(const LLUUID& root_id, F32 delay) +{ + // No-op if a timer is already pending for this root_id + if (mPublishedObjectManager.hasActiveLinksetFlushTimer(root_id)) + { + return; + } + + wptr_t weak = std::static_pointer_cast<LLScriptEditorWSServer>(shared_from_this()); + LLEventTimer* t = LLEventTimer::run_after(delay, [weak, root_id]() + { + if (auto self = weak.lock()) + { + self->mPublishedObjectManager.clearLinksetFlushTimer(root_id); + self->mPublishedObjectManager.clearPendingNewChildren(root_id); // clear any remaining pending children (timeout path) + self->flushLinksetUpdate(root_id); + } + }); + mPublishedObjectManager.setLinksetFlushTimer(root_id, t->getWeak()); +} + +void LLScriptEditorWSServer::cancelLinksetFlushTimer(const LLUUID& root_id) +{ + mPublishedObjectManager.cancelLinksetFlushTimer(root_id); +} + +void LLScriptEditorWSServer::flushLinksetUpdate(const LLUUID& root_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLSD update; + if (!mPublishedObjectManager.buildLinksetUpdateLLSD(root_id, update)) + { + return; + } + notifyAll("object.update", update); + + const LLSD linked_objects = update["linked_objects"]; + LL_INFOS("ScriptEditorWS") << "Linkset update for " << root_id + << ": " << linked_objects.size() << " child(ren)" << LL_ENDL; +} + +void LLScriptEditorWSServer::onPrimInventoryChanged(const LLUUID& object_id, const LLUUID& prim_id) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (!mPublishedObjectManager.hasPublished(object_id)) + { + return; + } + + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + { + return; + } + + auto inv_result = mPublishedObjectManager.handlePrimInventoryChangedEvent( + object_id, prim_id, prim, LLTimer::getTotalSeconds().value()); + + if (inv_result.mTimingConsumed) + { + LL_DEBUGS("ScriptEditorWS") << "[Phase0] inventory refresh object_id=" << object_id + << " prim_id=" << prim_id + << " elapsed_sec=" << inv_result.mTimingElapsedSec << LL_ENDL; + } + + if (inv_result.mKind == LLPublishedObjectMgr::InventoryChangeKind::CHILD_READY_WAIT) + { + return; + } + if (inv_result.mKind == LLPublishedObjectMgr::InventoryChangeKind::CHILD_READY_FLUSH_NOW) + { + cancelLinksetFlushTimer(object_id); + flushLinksetUpdate(object_id); + return; + } + if (inv_result.mKind == LLPublishedObjectMgr::InventoryChangeKind::ROOT_INVENTORY_UPDATE || + inv_result.mKind == LLPublishedObjectMgr::InventoryChangeKind::CHILD_INVENTORY_UPDATE) + { + notifyAll("object.update", inv_result.mUpdate); + if (inv_result.mHasPendingItemCreate) + { + LLEventPumps::instance().post( + inv_result.mPendingItemCreatePump, + LLSD().with("prim_id", prim_id)); + } + + LL_DEBUGS("ScriptEditorWS") << "Sent object.update for prim " << prim_id + << " in object " << object_id << LL_ENDL; + } +} + +void LLScriptEditorWSServer::onObjectPropertyChanged( + const LLUUID& prim_id, const std::string& name, const std::string& desc, S16 inventory_serial) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LLViewerObject* prim = gObjectList.findObject(prim_id); + if (!prim) + { + return; + } + + LLUUID root_id = prim->getRootEdit()->getID(); + + mPublishedObjectManager.recordPendingPropertyChange(root_id, prim_id, name, desc); + + bool should_refresh_inventory = mPublishedObjectManager.markPrimInventorySerialAndDetectChange( + root_id, + prim_id, + inventory_serial); + + LLSD update; + if (mPublishedObjectManager.applyPropertyChange(root_id, prim_id, name, desc, update)) + { + notifyAll("object.update", update); + } + + if (should_refresh_inventory && !mPublishedObjectManager.hasInventoryRequestStart(prim_id)) + { + prim->dirtyInventory(); + mPublishedObjectManager.setInventoryRequestStart(prim_id, LLTimer::getTotalSeconds().value()); + prim->requestInventory(); + } +} + +void LLScriptEditorWSServer::unpublishObject(const LLUUID& object_id, const std::string& reason) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + if (!mPublishedObjectManager.cleanupObjectStateForUnpublish(object_id)) + { + return; + } + + LLSD message; + message["object_id"] = object_id; + if (!reason.empty()) + { + message["reason"] = reason; + } + notifyAll("object.unpublish", message); + + LL_DEBUGS("ScriptEditorWS") << "Unpublished object " << object_id + << " reason: " << reason << LL_ENDL; +} + + +//======================================================================== +std::atomic<U32> LLScriptEditorWSConnection::sNextConnectionID{1}; + +std::shared_ptr<LLScriptEditorWSServer> LLScriptEditorWSConnection::getServer() const +{ + return std::static_pointer_cast<LLScriptEditorWSServer>(mOwningServer.lock()); +} + +void LLScriptEditorWSConnection::onOpen() +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + // Call parent class to set up JSON-RPC infrastructure + LLJSONRPCConnection::onOpen(); + + LL_INFOS("ScriptEditorWS") << "Script editor JSON-RPC connection opened" << LL_ENDL; + + // Build hello data + LLSD handshake; + handshake["server_version"] = "1.0.0"; + handshake["protocol_version"] = "1.0"; + handshake["viewer_name"] = LLVersionInfo::instance().getChannel(); + handshake["viewer_version"] = LLVersionInfo::instance().getVersion(); + + handshake["agent_id"] = gAgent.getID(); + handshake["agent_name"] = gAgentUsername; + + std::string challenge_file = generateChallenge(); + if (!challenge_file.empty()) + { + handshake["challenge"] = challenge_file; + } + + LLSD languages = LLSD::emptyArray(); + languages.append("lsl"); + languages.append("luau"); + handshake["languages"] = languages; + handshake["syntax_id"] = LLSyntaxDefCache::instance().getSyntaxID(); + + // Features object + LLSD features; + features["live_sync"] = true; + features["compilation"] = true; + features["syntax_cache"] = true; + features["commands"] = true; + features["unified_diagnostics"] = true; + handshake["features"] = features; + + wptr_t that = weak_from_this(); + + // Send session.handshake method call and the response + call("session.handshake", handshake, [that](const LLSD& result, const LLSD& error) { + if (error.isUndefined()) + { + auto self = that.lock(); + if (self) + { + self->handleHandshakeResponse(result); + } + } + else + { + LL_WARNS("ScriptEditorWS") << "Handshake failed: " + << error["message"].asString() << LL_ENDL; + } + }); + + LL_INFOS("ScriptEditorWS") << "Sent handshake call to new editor client" << LL_ENDL; +} + +void LLScriptEditorWSConnection::onClose() +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + // Call parent class to clean up JSON-RPC infrastructure + LLJSONRPCConnection::onClose(); + mOwningServer.reset(); + + // Clean up handshake response data + mClientName.clear(); + mClientVersion.clear(); + mProtocolVersion.clear(); + mScriptName.clear(); + mScriptLanguage.clear(); + mLanguages.clear(); + mFeatures.clear(); +} + +void LLScriptEditorWSConnection::sendDisconnect(DisconnectReason reason, const std::string& message) +{ + LL_INFOS("ScriptEditorWS") << "Sending disconnect to client: " << message << LL_ENDL; + LLSD params; + params["reason"] = static_cast<S32>(reason); + params["message"] = message; + notify("session.disconnect", params); + closeConnection(1000, message); +} + +void LLScriptEditorWSConnection::handleHandshakeResponse(const LLSD& result) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_SCRIPTDEV; + LL_INFOS("ScriptEditorWS") << "Processing handshake response from client" << LL_ENDL; + + mClientName = result["client_name"].asString(); + mClientVersion = result["client_version"].asString(); + mProtocolVersion = result["protocol_version"].asString(); + + // Validate challenge response (if a challenge was issued). + const bool challenge_issued = mChallenge.notNull(); + bool valid_response = true; + if (challenge_issued) + { + valid_response = result.has("challenge_response") && + (result["challenge_response"].asUUID() == mChallenge); + mChallenge.setNull(); + } + + // Always clean up the temporary challenge file if one was created, + // regardless of validation outcome. + if (!mChallengeFile.empty()) + { + LLFile::remove(mChallengeFile); + mChallengeFile.clear(); + } + + if (challenge_issued && !valid_response) + { + LL_WARNS("ScriptEditorWS") << "Invalid or missing challenge response from client" << LL_ENDL; + sendDisconnect(DisconnectReason::PROTOCOL_ERROR, "Invalid challenge response"); + return; + } + + if (mProtocolVersion != "1.0") + { + LL_WARNS("ScriptEditorWS") << "Protocol version mismatch. Expected: 1.0, Got: " + << mProtocolVersion << LL_ENDL; + } + + mScriptName = result["script_name"].asString(); + mScriptLanguage = result["script_language"].asString(); + + for (const auto& lang : llsd::inArray(result["languages"])) + { + if (lang.isString()) + { + mLanguages.insert(lang.asString()); + } + } + + for (const auto& [feature, enabled] : llsd::inMap(result["features"])) + { + if (enabled.asBoolean()) + { + mFeatures.insert(feature); + } + } + + notify("session.ok"); + + LL_INFOS("ScriptEditorWS") << "Handshake completed successfully." << LL_ENDL; +} + +std::string LLScriptEditorWSConnection::generateChallenge() +{ + mChallenge.generate(); + + mChallengeFile = std::string(LLFile::tmpdir()) + "sl_script_challenge_" + mChallenge.asString() + ".tmp"; + + llofstream file(mChallengeFile.c_str()); + if (!file.is_open()) + { + LL_WARNS("ScriptEditorWS") << "Unable to open challenge file: " << mChallengeFile << LL_ENDL; + mChallenge.setNull(); + mChallengeFile.clear(); + return std::string(); + } + + file << mChallenge; + file.close(); + + return mChallengeFile; +} + diff --git a/indra/newview/llscripteditorws.h b/indra/newview/llscripteditorws.h new file mode 100644 index 0000000000..1dc218853b --- /dev/null +++ b/indra/newview/llscripteditorws.h @@ -0,0 +1,352 @@ +/** + * @file llscripteditorws.h + * @brief WebSocket server and connection classes for external script editor integration + * + * $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$ + */ + +#pragma once + +#include "lljsonrpcws.h" +#include "llpublishedobjectmgr.h" +#include "llsd.h" +#include "lluuid.h" +#include "llhandle.h" +#include "lltimer.h" +#include "lleventtimer.h" + +#include <memory> +#include <string> +#include <vector> +#include <map> +#include <set> +#include <atomic> +#include <functional> + +// Forward declarations +class LLLiveLSLEditor; +class LLScriptEdContainer; +class LLScriptEditorWSServer; +class LLChat; +class LLPanel; +class LLViewerObject; +class LLInventoryItem; + +class LLScriptEditorWSConnection : public LLJSONRPCConnection, public std::enable_shared_from_this<LLScriptEditorWSConnection> +{ +public: + using ptr_t = std::shared_ptr<LLScriptEditorWSConnection>; + using wptr_t = std::weak_ptr<LLScriptEditorWSConnection>; + + enum class DisconnectReason : S32 + { + NORMAL = 0, + EDITOR_CLOSED = 1, + PROTOCOL_ERROR = 2, + TIMEOUT = 3, + INTERNAL_ERROR = 4 + }; + + LLScriptEditorWSConnection(const LLWebsocketMgr::WSServer::ptr_t server, const LLWebsocketMgr::connection_h& handle) : + LLJSONRPCConnection(server, handle) + { + // Reserve id 0 as the "unassigned" sentinel used by EditorSubscription; + // on wrap, skip past it. + U32 id; + do + { + id = sNextConnectionID.fetch_add(1, std::memory_order_relaxed); + } + while (id == 0); + mConnectionID = id; + } + + ~LLScriptEditorWSConnection() override = default; + + U32 getConnectionID() const { return mConnectionID; } + + // Connection lifecycle overrides + void onOpen() override; + void onClose() override; + + void sendDisconnect(DisconnectReason reason = DisconnectReason::NORMAL, const std::string& message = "Goodbye"); + bool hasFeature(const std::string& feature) const; + +private: + using string_set_t = std::set<std::string>; + /** + * @brief Handle the handshake response from the client + * @param result The response data from the client containing client information + */ + void handleHandshakeResponse(const LLSD& result); + std::string generateChallenge(); + + LLScriptEdContainer* getEditor() const; + std::shared_ptr<LLScriptEditorWSServer> getServer() const; + + U32 mConnectionID{ 0 }; ///< Unique identifier for this connection + + // Client handshake response data + std::string mClientName; ///< Name of the external editor client + std::string mClientVersion; ///< Version of the external editor client + std::string mProtocolVersion; ///< JSON-RPC protocol version supported by client + std::string mScriptName; ///< Name of the script being edited + std::string mScriptLanguage; ///< Programming language of the script (lsl, luau, etc.) + string_set_t mLanguages; ///< Set of supported scripting languages + string_set_t mFeatures; ///< Active client features (live_sync, compilation, etc.) + LLUUID mChallenge; + std::string mChallengeFile; ///< Temporary file used for challenge-response verification + + static std::atomic<U32> sNextConnectionID; +}; + +/** + * @class LLScriptEditorWSServer + * @brief JSON-RPC 2.0 WebSocket server for external script editor integration + * + * This server extends the JSON-RPC server to provide specialized functionality + * for external script editor integration. It manages WebSocket connections from + * external script editors and provides a structured JSON-RPC 2.0 interface + * between the Second Life viewer's script editing functionality and external + * development tools. + * + * ## Architecture + * + * The server acts as a JSON-RPC communication hub between: + * - LLLiveLSLEditor instances (in-world script editing) + * - External script editors (VS Code, Atom, Sublime Text, etc.) + * - Script compilation and save services + * + * ## Usage + * + * @code + * // Create and start the JSON-RPC server + * auto server = std::make_shared<LLScriptEditorWSServer>("script_editor_server", 9020); + * LLWebsocketMgr::getInstance()->addServer(server); + * LLWebsocketMgr::getInstance()->startServer("script_editor_server"); + * + * // Associate with an LSL editor + * server->associateEditor(editor_handle, script_id); + * @endcode + * + * ## Security Considerations + * + * - Server binds to localhost only by default for security + * - JSON-RPC 2.0 structured protocol with validation + * - Rate limiting handled by base JSON-RPC server + * - Error handling with standardized JSON-RPC error codes + */ +class LLScriptEditorWSServer : public LLJSONRPCServer +{ +public: + struct ItemRef + { + LLUUID mRootID; + LLUUID mPrimID; + LLUUID mItemID; + std::string mScriptName; + }; + + static constexpr U32 ALL_CONNECTIONS = 0xFFFFFFFF; + enum class SubscriptionError + { + SUCCESS = 0, + INVALID_EDITOR, + INVALID_SUBSCRIPTION, + ALREADY_SUBSCRIBED, + INTERNAL_ERROR + }; + + static constexpr const char* DEFAULT_SERVER_NAME = "script_editor_server"; + static constexpr U16 DEFAULT_SERVER_PORT = 9020; + + using ptr_t = std::shared_ptr<LLScriptEditorWSServer>; + using wptr_t = std::weak_ptr<LLScriptEditorWSServer>; + + LLScriptEditorWSServer(const std::string& name, U16 port, bool local_only = true); + + ~LLScriptEditorWSServer() override = default; + + static LLScriptEditorWSServer::ptr_t getServer(); + static LLScriptEditorWSServer::ptr_t ensureServerRunning(); + static std::string buildScriptSubscriptionId(const LLUUID& object_id, + const LLUUID& item_id); + static std::string buildVSCodeURI(const LLUUID& object_id = LLUUID::null, + const LLUUID& script_id = LLUUID::null); + static bool launchVSCode(const LLUUID& object_id = LLUUID::null, + const LLUUID& script_id = LLUUID::null); + + void onStarted() override; + void onStopped() override; + void onConnectionOpened(const LLWebsocketMgr::WSConnection::ptr_t& connection) override; + void onConnectionClosed(const LLWebsocketMgr::WSConnection::ptr_t& connection) override; + + bool subscribeScriptEditor(const LLUUID& object_id, const LLUUID& item_id, std::string_view script_name, + const LLHandle<LLPanel>& editor_handle, const std::string &script_id); + void unsubscribeEditor(const std::string &script_id); + + void notifyScript(const std::string& script_id, const std::string& method, const LLSD& message) const; + void sendUnsubscribeScriptEditor(const std::string& script_id); + void sendCompileResults(const std::string& script_id, const LLSD& results) const; + + LLHandle<LLPanel> findEditorForScript(const std::string& script_id) const; + + void forwardChatToIDE( + const LLChat& chat_msg, + LLPublishedObjectMgr::RuntimeEventAggregator::Channel channel) const; + + std::set<std::string> getActiveScripts() const; + + // --- Object Content Publishing --- + bool publishObject(const LLUUID& object_id); + void unpublishObject(const LLUUID& object_id, const std::string& reason = ""); + bool isObjectPublished(const LLUUID& object_id) const; + + // *TODO*: These should be moved to LLPublishedObjectMgr at some point. + void onPrimInventoryReady(const LLUUID& object_id, const LLUUID& prim_id); + void onPrimInventoryChanged(const LLUUID& object_id, const LLUUID& prim_id); + void onObjectPropertyChanged(const LLUUID& prim_id, const std::string& name, const std::string& desc, S16 inventory_serial = -1); + void onLinksetChildAdded(const LLUUID& root_id, LLViewerObject* child); + void onLinksetChildRemoved(const LLUUID& root_id, const LLUUID& child_id); + + static bool isEnabled(); + static bool isTightIntegration(); + +protected: + LLWebsocketMgr::WSConnection::ptr_t connectionFactory(LLWebsocketMgr::WSServer::ptr_t server, + LLWebsocketMgr::connection_h handle) override; + + void setupConnectionMethods(LLJSONRPCConnection::ptr_t connection) override; + + void broadcastLanguageChange(); + + LLSD handleLanguageIdRequest() const; + LLSD handleSyntaxRequest(const LLSD ¶ms) const; + LLSD handleSyntaxCacheRequest() const; + LLSD handleSyntaxCacheFileRequest(const LLSD& params) const; + LLSD handleScriptSubscribe(U32 connection_id, const LLSD& params); + LLSD handleScriptUnsubscribe(U32 connection_id, const LLSD& params); + LLSD handleFileWatcherFileListRequest() const; + LLSD handleObjectRequest(U32 connection_id, const LLSD& params); + LLSD handleObjectContentGet(const std::string& method, const LLSD& id, const LLSD& params); + LLSD handleObjectContentSave(const std::string& method, const LLSD& id, const LLSD& params); + LLSD saveScript(LLViewerObject* prim, LLInventoryItem* item, const std::string& content, const LLSD& params); + LLSD saveNotecard(LLViewerObject* prim, LLInventoryItem* item, const std::string& content); + LLSD handleObjectItemDelete(U32 connection_id, const LLSD& params); + LLSD handleObjectItemCreate(const std::string& method, const LLSD& id, const LLSD& params); + LLSD handleObjectUnpublish(U32 connection_id, const LLSD& params); + LLSD handleObjectList() const; + LLSD handleObjectScriptSetRunning(U32 connection_id, const LLSD& params); + LLSD handleObjectScriptReset(U32 connection_id, const LLSD& params); + LLSD handleObjectModify(U32 connection_id, const LLSD& params); + LLSD handleObjectItemModify(U32 connection_id, const LLSD& params); + LLSD handleCommandExecute(U32 connection_id, const LLSD& params); + LLSD handleSaveBackToObjectContents(U32 connection_id, const LLSD& params); + LLSD handleCommandList(); + void sendCommandExecute(U32 connection_id, const std::string& command, const LLSD& params); + + struct ValidatedItem + { + LLViewerObject* prim{ nullptr }; + LLViewerObject* root{ nullptr }; + LLInventoryItem* item{ nullptr }; + LLAssetType::EType type{ LLAssetType::AT_NONE }; + }; + ValidatedItem validatePublishedItem(const LLSD& params, U32 permMask) const; + + // --- Object Content Publishing (helpers) --- + static std::string getPrimName(LLViewerObject* obj); + void notifyConnection(U32 connection_id, const std::string& method, const LLSD& params) const; + void notifyAll(const std::string& method, const LLSD& params) const; + void buildAndSendPublish(const LLUUID& object_id); + void scheduleLinksetFlush(const LLUUID& root_id, F32 delay); + void cancelLinksetFlushTimer(const LLUUID& root_id); + void flushLinksetUpdate(const LLUUID& root_id); + + /// Wraps `fn` in a MethodHandler with a weak-ptr guard on this server, + /// so the handler safely no-ops after server shutdown. `fn` is called + /// with (LLScriptEditorWSServer&, method, id, params) and returns LLSD. + template <typename Fn> + LLJSONRPCConnection::MethodHandler bindHandler(Fn fn) + { + std::weak_ptr<LLWebsocketMgr::WSServer> weak_base = weak_from_this(); + return [weak_base, fn = std::move(fn)] + (const std::string& method, const LLSD& id, const LLSD& params) -> LLSD + { + auto base = weak_base.lock(); + if (!base) + { + return LLSD(); + } + auto server = std::static_pointer_cast<LLScriptEditorWSServer>(base); + return fn(*server, method, id, params); + }; + } + +private: + void sendRuntimeEvent( + const LLPublishedObjectMgr::RuntimeChatEvent& event) const; + + struct EditorSubscription + { + EditorSubscription(const ItemRef& item_ref, LLHandle<LLPanel> editor_handle): + mItemRef(item_ref), + mEditorHandle(editor_handle) + { + } + U32 mConnectionID{ 0 }; + ItemRef mItemRef; + LLScriptEditorWSConnection::wptr_t mConnection; + LLHandle<LLPanel> mEditorHandle; + }; + using subscriptions_t = std::unordered_map<std::string, EditorSubscription>; + + SubscriptionError updateScriptSubscription(const std::string &script_id, U32 connection_id); + void unsubscribeConnection(U32 connection_id); + + subscriptions_t mSubscriptions; + std::unordered_map<U32, S32> mConnectionSubscriptionCounts; + std::map<U32, LLScriptEditorWSConnection::wptr_t> mActiveConnections; + + mutable LLPublishedObjectMgr mPublishedObjectManager; + + struct WSCommandInfo + { + std::string command; + std::string description; + }; + enum WSCommandError + { + UnknownCommand = 1, + InvalidParams = 2, + NotPermitted = 3, + ExecutionError = 4, + }; + using WSCommandHandler = std::function<LLSD(U32 connection_id, const LLSD& params)>; + std::unordered_map<std::string, std::pair<WSCommandInfo, WSCommandHandler>> mCommandRegistry; + + void registerCommand(const WSCommandInfo& info, WSCommandHandler handler); + + boost::signals2::connection mLanguageChangeSignal; + LLUUID mLastSyntaxId; + +}; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 32cf1f3ca1..ed4717a4dc 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -97,6 +97,7 @@ #include "llpanelface.h" #include "llglheaders.h" #include "llinventoryobserver.h" +#include "llscripteditorws.h" LLViewerObject* getSelectedParentObject(LLViewerObject *object) ; // @@ -252,7 +253,6 @@ LLSelectMgr::LLSelectMgr() LLSelectMgr::~LLSelectMgr() { clearSelections(); - mSlectionLodModChangedConnection.disconnect(); } void LLSelectMgr::clearSelections() @@ -6108,6 +6108,11 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data node->mInventorySerial = inv_serial; node->mSitName.assign(sit_name); node->mTouchName.assign(touch_name); + + if (auto ws_server = LLScriptEditorWSServer::getServer()) + { + ws_server->onObjectPropertyChanged(id, name, desc, inv_serial); + } } } @@ -6204,6 +6209,11 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use } dialog_refresh_all(); + + if (auto ws_server = LLScriptEditorWSServer::getServer()) + { + ws_server->onObjectPropertyChanged(id, name, desc); + } } @@ -6624,7 +6634,7 @@ void LLSelectMgr::renderSilhouettes(bool for_hud) gGL.popMatrix(); gGL.popMatrix(); - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 11aad3b806..792a37297f 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -943,7 +943,6 @@ private: bool mForceSelection; std::vector<LLAnimPauseRequest> mPauseRequests; - boost::signals2::connection mSlectionLodModChangedConnection; }; // *DEPRECATED: For callbacks or observers, use diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 6023f6885d..8329ed86da 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -364,7 +364,7 @@ bool LLSettingsVOBase::exportFile(const LLSettingsBase::ptr_t &settings, const s { try { - std::ofstream file(filename, std::ios::out | std::ios::trunc); + llofstream file(filename, std::ios::out | std::ios::trunc); file.exceptions(std::ios_base::failbit | std::ios_base::badbit); if (!file) @@ -390,7 +390,7 @@ LLSettingsBase::ptr_t LLSettingsVOBase::importFile(const std::string &filename) try { - std::ifstream file(filename, std::ios::in); + llifstream file(filename, std::ios::in); file.exceptions(std::ios_base::failbit | std::ios_base::badbit); if (!file) diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 6e5d9a6c77..d6f5bb1202 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -54,7 +54,6 @@ #include "llviewertexturelist.h" #include "llwindow.h" #include "llworld.h" -#include <boost/filesystem.hpp> constexpr F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -238,11 +237,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) ; + //gGL.setLineWidth(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) ; + //gGL.setLineWidth(line_width) ; //draw four alpha rectangles to cover areas outside of the snapshot image if(!mKeepAspectRatio) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index d2c7c5e5ce..4295149fad 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1664,13 +1664,11 @@ void renderOctree(LLSpatialGroup* group) #endif gGL.diffuseColor4f(1,0,0,group->mBuilt); - gGL.flush(); - //glLineWidth(5.f); + //gGL.setLineWidth(5.f); const LLVector4a* bounds = group->getObjectBounds(); drawBoxOutline(bounds[0], bounds[1]); - //gGL.flush(); - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); gGL.flush(); const LLVOAvatar* lastAvatar = nullptr; @@ -1981,12 +1979,11 @@ void renderBoundingBox(LLDrawable* drawable, bool set_color = true) LLViewerObject* vobj = drawable->getVObj(); if (vobj && vobj->onActiveList()) { - gGL.flush(); - //glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); - stop_glerror(); + //gGL.setLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); + //gGL.setLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f)); + stop_glerror(); drawBoxOutline(pos,size); - gGL.flush(); - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); } else { @@ -2498,14 +2495,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume, bool wireframe llassert(LLGLSLShader::sCurBoundShader != 0); LLVertexBuffer::unbind(); -#if GL_VERSION_1_1 - glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints); -#endif gGL.diffuseColor4fv(color.mV); - gGL.syncMatrices(); - glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); + + LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, nullptr, phys_volume->mNumHullIndices, phys_volume->mHullIndices); } else { @@ -2899,8 +2893,7 @@ public: if (i == 1) { - gGL.flush(); - //glLineWidth(3.f); + //gGL.setLineWidth(3.f); } gGL.begin(LLRender::TRIANGLES); @@ -2918,8 +2911,7 @@ public: if (i == 1) { - gGL.flush(); - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); } } } @@ -3646,12 +3638,11 @@ bool LLSpatialPartition::isVisible(const LLVector3& v) return true; } -LL_ALIGN_PREFIX(16) -class LLOctreeIntersect : public LLOctreeTraveler<LLViewerOctreeEntry, LLPointer<LLViewerOctreeEntry>> +class alignas(16) LLOctreeIntersect : public LLOctreeTraveler<LLViewerOctreeEntry, LLPointer<LLViewerOctreeEntry>> { public: - LL_ALIGN_16(LLVector4a mStart); - LL_ALIGN_16(LLVector4a mEnd); + LLVector4a mStart; + LLVector4a mEnd; S32 *mFaceHit; LLVector4a *mIntersection; @@ -3801,7 +3792,7 @@ public: return false; } -} LL_ALIGN_POSTFIX(16); +}; LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, bool pick_transparent, diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 4b312b1597..2e918df910 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -64,7 +64,7 @@ void pushVerts(LLFace* face); Make every effort to keep size minimal. Member ordering is important for cache coherency */ -class LLDrawInfo final : public LLRefCount +class alignas(16) LLDrawInfo final : public LLRefCount { LL_ALIGN_NEW; protected: @@ -190,12 +190,13 @@ public: }; }; -LL_ALIGN_PREFIX(16) -class LLSpatialGroup : public LLOcclusionCullingGroup +class alignas(16) LLSpatialGroup : public LLOcclusionCullingGroup { using super = LLOcclusionCullingGroup; friend class LLSpatialPartition; friend class LLOctreeStateCheck; + + LL_ALIGN_NEW public: LLSpatialGroup(const LLSpatialGroup& rhs) = delete; @@ -322,8 +323,8 @@ public: virtual void rebound(); public: - LL_ALIGN_16(LLVector4a mViewAngle); - LL_ALIGN_16(LLVector4a mLastUpdateViewAngle); + LLVector4a mViewAngle; + LLVector4a mLastUpdateViewAngle; protected: virtual ~LLSpatialGroup(); @@ -353,7 +354,7 @@ public: U32 mRenderOrder = 0; // Reflection Probe associated with this node (if any) LLPointer<LLReflectionMap> mReflectionProbe = nullptr; -} LL_ALIGN_POSTFIX(16); +}; class LLGeometryManager { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 494a1b3378..3ac5c9d896 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -24,6 +24,72 @@ * $/LicenseInfo$ */ +// +// LOGIN AND CONNECTION SEQUENCE OVERVIEW +// ====================================== +// The Viewer connects to the SL service in two phases: HTTP authentication +// followed by UDP "Circuit" establishment to the first Simulator. +// +// PHASE 1: HTTP LOGIN (see lllogin.cpp, process_login_success_response()) +// ----------------------------------------------------------------------- +// Viewer sends an XMLRPC HTTP POST to LoginServer containing: +// - Credentials (first name, last name, password) +// - Client version, channel, MAC address, machine ID +// - Start location preferences +// +// Login-server responds with critical connection data: +// - agent_id, session_id, secure_session_id (authentication tokens) +// - Circuit_code (used to establish UDP Circuit with Simulator) +// - sim_ip, sim_port (Simulator address to connect to) +// - seed_capability (base URL for HTTP capability requests) +// - region_x, region_y (region grid coordinates) +// +// PHASE 2: UDP CIRCUIT ESTABLISHMENT (see idle_startup() state machine below) +// --------------------------------------------------------------------------- +// After HTTP login succeeds, Viewer establishes a UDP Circuit with the +// simulator. This also happens whenever the Viewer connects to new Simulators +// in the same session. The following UDP messages are exchanged: +// +// 1. UseCircuitCode (Viewer -> Simulator) +// - Sent in STATE_WORLD_INIT +// - Contains: Circuit_code, session_id, agent_id +// - Establishes the UDP Circuit with the Simulator +// +// 2. RegionHandshake (Simulator -> Viewer) +// - Handled by process_region_handshake() in llworld.cpp +// - Contains: region name, terrain textures, water height, region flags +// - Viewer responds with RegionHandshakeReply +// +// 3. CompleteAgentMovement (Viewer -> Simulator) +// - Sent in STATE_AGENT_SEND via send_complete_agent_movement() +// - Signals the Viewer is ready to enter the world +// +// 4. AgentMovementComplete (Simulator -> Viewer) +// - Handled by process_agent_movement_complete() in llviewermessage.cpp +// - Contains: final agent position, look_at direction, region handle +// - Sets gAgentMovementCompleted = true +// - Agent is now fully connected to the region +// +// STARTUP STATE MACHINE +// --------------------- +// The connection sequence is managed by idle_startup() which progresses +// through these key states: +// +// STATE_LOGIN_WAIT - Waiting for HTTP login response +// STATE_LOGIN_PROCESS_RESPONSE - Processing login response data +// STATE_WORLD_INIT - Send UseCircuitCode, enable UDP Circuit +// STATE_WORLD_WAIT - Wait for Circuit acknowledgment +// STATE_AGENT_SEND - Send CompleteAgentMovement +// STATE_AGENT_WAIT - Wait for AgentMovementComplete +// STATE_INVENTORY_SEND - Agent connected, begin loading inventory +// +// HTTP CAPABILITIES +// ----------------- +// After UDP connection, Viewer fetches "capability" URLs from the +// seed_capability endpoint. These provide HTTP endpoints for various +// services (inventory, textures, etc.) that supplement the UDP protocol. +// + #include "llviewerprecompiledheaders.h" #include "llappviewer.h" @@ -192,7 +258,6 @@ #include "llnamelistctrl.h" #include "llnamebox.h" #include "llnameeditor.h" -#include "llpostprocess.h" #include "llagentlanguage.h" #include "llwearable.h" #include "llinventorybridge.h" @@ -283,7 +348,6 @@ void show_first_run_dialog(); bool first_run_dialog_callback(const LLSD& notification, const LLSD& response); void set_startup_status(const F32 frac, const std::string& string, const std::string& msg); bool login_alert_status(const LLSD& notification, const LLSD& response); -void use_circuit_callback(void**, S32 result); void register_viewer_callbacks(LLMessageSystem* msg); void asset_callback_nothing(const LLUUID&, LLAssetType::EType, void*, S32); bool callback_choose_gender(const LLSD& notification, const LLSD& response); @@ -342,7 +406,7 @@ void do_startup_frame() break; } } - if (needs_drain || gMessageSystem->mPacketRing.getNumBufferedPackets() > 0) + if (needs_drain || gMessageSystem->getNumBufferedPackets() > 0) { gMessageSystem->drainUdpSocket(); } @@ -600,7 +664,7 @@ bool idle_startup() std::string message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message_template.msg"); LLFILE* found_template = NULL; - found_template = LLFile::fopen(message_template_path, "r"); /* Flawfinder: ignore */ + found_template = LLFile::fopen(message_template_path, LLFILE_MODE("r")); /* Flawfinder: ignore */ #if LL_WINDOWS // On the windows dev builds, unpackaged, the message_template.msg @@ -609,7 +673,7 @@ bool idle_startup() if (!found_template) { message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "message_template.msg"); - found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */ + found_template = LLFile::fopen(message_template_path.c_str(), LLFILE_MODE("r")); /* Flawfinder: ignore */ } #elif LL_DARWIN // On Mac dev builds, message_template.msg lives in: @@ -619,7 +683,7 @@ bool idle_startup() message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "message_template.msg"); - found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */ + found_template = LLFile::fopen(message_template_path.c_str(), LLFILE_MODE("r")); /* Flawfinder: ignore */ } #endif @@ -726,7 +790,7 @@ bool idle_startup() F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); - msg->mPacketRing.setDropPercentage(dropPercent); + msg->setDropPercentage(dropPercent); } LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL; @@ -858,6 +922,7 @@ bool idle_startup() set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str()); do_startup_frame(); // LLViewerMedia::initBrowser(); + LLAppViewer::instance()->createInitedMarker(); LLStartUp::setStartupState( STATE_LOGIN_SHOW ); return false; } @@ -1413,10 +1478,6 @@ bool idle_startup() LLDrawable::initClass(); do_startup_frame(); - // init the shader managers - LLPostProcess::initClass(); - do_startup_frame(); - LLAvatarAppearance::initClass("avatar_lad.xml","avatar_skeleton.xml"); do_startup_frame(); @@ -1746,13 +1807,48 @@ bool idle_startup() gUseCircuitCallbackCalled = false; msg->enableCircuit(gFirstSim, true); - // now, use the circuit info to tell simulator about us! + + // UDP CONNECTION STEP 1: Send UseCircuitCode + // This is the first UDP message sent to Simulator after HTTP login. + // It establishes the UDP circuit using the circuit_code received from + // LoginServer. Simulator will respond with an ACK, then send + // RegionHandshake message with region details. LL_INFOS("AppInit") << "viewer: UserLoginLocationReply() Enabling " << gFirstSim << " with code " << msg->mOurCircuitCode << LL_ENDL; msg->newMessageFast(_PREHASH_UseCircuitCode); msg->nextBlockFast(_PREHASH_CircuitCode); msg->addU32Fast(_PREHASH_Code, msg->mOurCircuitCode); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->addUUIDFast(_PREHASH_ID, gAgent.getID()); + + // build a lambda to be used as callback on ACK or timeout + void (*use_circuit_callback)(void**, S32) = [](void**, S32 result) + { + // bail if we're quitting. + if(LLApp::isExiting()) return; + if( !gUseCircuitCallbackCalled ) + { + gUseCircuitCallbackCalled = true; + if (result != LL_ERR_NOERR) + { + // Make sure user knows something bad happened. JC + LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL; + if (gRememberPassword) + { + LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status); + } + else + { + LLNotificationsUtil::add("LoginPacketNeverReceivedNoTP", LLSD(), LLSD(), login_alert_status); + } + reset_login(); + } + else + { + gGotUseCircuitCodeAck = true; + } + } + }; + msg->sendReliable( gFirstSim, gSavedSettings.getS32("UseCircuitCodeMaxRetries"), @@ -1770,6 +1866,9 @@ bool idle_startup() //--------------------------------------------------------------------- // World Wait //--------------------------------------------------------------------- + // UDP CONNECTION STEP 2: Wait for UseCircuitCode acknowledgment + // While waiting, Simulator also sends RegionHandshake (handled by + // process_region_handshake() in llworld.cpp) containing region info. if(STATE_WORLD_WAIT == LLStartUp::getStartupState()) { LL_DEBUGS("AppInit") << "Waiting for simulator ack...." << LL_ENDL; @@ -1785,13 +1884,16 @@ bool idle_startup() //--------------------------------------------------------------------- // Agent Send //--------------------------------------------------------------------- + // UDP CONNECTION STEP 3: Send CompleteAgentMovement + // After the circuit is established and RegionHandshake received, we signal + // to Simulator the Viewer is ready to enter the world. if (STATE_AGENT_SEND == LLStartUp::getStartupState()) { LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL; set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD); do_startup_frame(); - // register with the message system so it knows we're - // expecting this message + // Register handler process_agent_movement_complete for AgentMovementComplete - + // the final UDP message confirming the agent is connected. LLMessageSystem* msg = gMessageSystem; msg->setHandlerFuncFast( _PREHASH_AgentMovementComplete, @@ -1834,12 +1936,17 @@ bool idle_startup() //--------------------------------------------------------------------- // Agent Wait //--------------------------------------------------------------------- + // UDP CONNECTION STEP 4: Wait for AgentMovementComplete + // Simulator responds with the agent's confirmed position and look_at + // direction. Once received, gAgentMovementCompleted is set true and the + // agent is fully connected to the region. if (STATE_AGENT_WAIT == LLStartUp::getStartupState()) { do_startup_frame(); if (gAgentMovementCompleted) { + // Connection complete - agent is now in-world LLStartUp::setStartupState( STATE_INVENTORY_SEND ); } do_startup_frame(); @@ -2838,209 +2945,147 @@ bool login_alert_status(const LLSD& notification, const LLSD& response) } -void use_circuit_callback(void**, S32 result) -{ - // bail if we're quitting. - if(LLApp::isExiting()) return; - if( !gUseCircuitCallbackCalled ) - { - gUseCircuitCallbackCalled = true; - if (result) - { - // Make sure user knows something bad happened. JC - LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL; - if (gRememberPassword) - { - LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status); - } - else - { - LLNotificationsUtil::add("LoginPacketNeverReceivedNoTP", LLSD(), LLSD(), login_alert_status); - } - reset_login(); - } - else - { - gGotUseCircuitCodeAck = true; - } - } -} - void register_viewer_callbacks(LLMessageSystem* msg) { - msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data ); - msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update ); - msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update ); - msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update ); + msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data); + msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update); + msg->setHandlerFuncFast(_PREHASH_ObjectUpdateCompressed, process_compressed_object_update); + msg->setHandlerFuncFast(_PREHASH_ObjectUpdateCached, process_cached_object_update); msg->setHandlerFuncFast(_PREHASH_ImprovedTerseObjectUpdate, process_terse_object_update_improved ); - msg->setHandlerFunc("SimStats", process_sim_stats); - msg->setHandlerFuncFast(_PREHASH_HealthMessage, process_health_message ); + msg->setHandlerFuncFast(_PREHASH_SimStats, process_sim_stats); + msg->setHandlerFuncFast(_PREHASH_HealthMessage, process_health_message); msg->setHandlerFuncFast(_PREHASH_EconomyData, process_economy_data); - msg->setHandlerFunc("RegionInfo", LLViewerRegion::processRegionInfo); + msg->setHandlerFuncFast(_PREHASH_RegionInfo, LLViewerRegion::processRegionInfo); - msg->setHandlerFuncFast(_PREHASH_ChatFromSimulator, process_chat_from_simulator); - msg->setHandlerFuncFast(_PREHASH_KillObject, process_kill_object, NULL); - msg->setHandlerFuncFast(_PREHASH_SimulatorViewerTimeMessage, process_time_synch, NULL); + msg->setHandlerFuncFast(_PREHASH_ChatFromSimulator, process_chat_from_simulator); + msg->setHandlerFuncFast(_PREHASH_KillObject, process_kill_object); + msg->setHandlerFuncFast(_PREHASH_SimulatorViewerTimeMessage,process_time_synch); msg->setHandlerFuncFast(_PREHASH_EnableSimulator, process_enable_simulator); msg->setHandlerFuncFast(_PREHASH_DisableSimulator, process_disable_simulator); - msg->setHandlerFuncFast(_PREHASH_KickUser, process_kick_user, NULL); + msg->setHandlerFuncFast(_PREHASH_KickUser, process_kick_user); - msg->setHandlerFunc("CrossedRegion", process_crossed_region); - msg->setHandlerFuncFast(_PREHASH_TeleportFinish, process_teleport_finish); + msg->setHandlerFuncFast(_PREHASH_CrossedRegion, process_crossed_region); + msg->setHandlerFuncFast(_PREHASH_TeleportFinish, process_teleport_finish); - msg->setHandlerFuncFast(_PREHASH_AlertMessage, process_alert_message); - msg->setHandlerFunc("AgentAlertMessage", process_agent_alert_message); - msg->setHandlerFuncFast(_PREHASH_MeanCollisionAlert, process_mean_collision_alert_message, NULL); - msg->setHandlerFunc("ViewerFrozenMessage", process_frozen_message); + msg->setHandlerFuncFast(_PREHASH_AlertMessage, process_alert_message); + msg->setHandlerFuncFast(_PREHASH_AgentAlertMessage, process_agent_alert_message); + msg->setHandlerFuncFast(_PREHASH_MeanCollisionAlert, process_mean_collision_alert_message); + msg->setHandlerFuncFast(_PREHASH_ViewerFrozenMessage, process_frozen_message); - msg->setHandlerFuncFast(_PREHASH_NameValuePair, process_name_value); - msg->setHandlerFuncFast(_PREHASH_RemoveNameValuePair, process_remove_name_value); - msg->setHandlerFuncFast(_PREHASH_AvatarAnimation, process_avatar_animation); - msg->setHandlerFuncFast(_PREHASH_ObjectAnimation, process_object_animation); - msg->setHandlerFuncFast(_PREHASH_AvatarAppearance, process_avatar_appearance); - msg->setHandlerFuncFast(_PREHASH_CameraConstraint, process_camera_constraint); - msg->setHandlerFuncFast(_PREHASH_AvatarSitResponse, process_avatar_sit_response); - msg->setHandlerFunc("SetFollowCamProperties", process_set_follow_cam_properties); - msg->setHandlerFunc("ClearFollowCamProperties", process_clear_follow_cam_properties); + msg->setHandlerFuncFast(_PREHASH_NameValuePair, process_name_value); + msg->setHandlerFuncFast(_PREHASH_RemoveNameValuePair, process_remove_name_value); + msg->setHandlerFuncFast(_PREHASH_AvatarAnimation, process_avatar_animation); + msg->setHandlerFuncFast(_PREHASH_ObjectAnimation, process_object_animation); + msg->setHandlerFuncFast(_PREHASH_AvatarAppearance, process_avatar_appearance); + msg->setHandlerFuncFast(_PREHASH_CameraConstraint, process_camera_constraint); + msg->setHandlerFuncFast(_PREHASH_AvatarSitResponse, process_avatar_sit_response); + msg->setHandlerFuncFast(_PREHASH_SetFollowCamProperties, process_set_follow_cam_properties); + msg->setHandlerFuncFast(_PREHASH_ClearFollowCamProperties, process_clear_follow_cam_properties); msg->setHandlerFuncFast(_PREHASH_ImprovedInstantMessage, process_improved_im); msg->setHandlerFuncFast(_PREHASH_ScriptQuestion, process_script_question); - msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties, NULL); - msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily, NULL); - msg->setHandlerFunc("ForceObjectSelect", LLSelectMgr::processForceObjectSelect); + msg->setHandlerFuncFast(_PREHASH_ObjectProperties, LLSelectMgr::processObjectProperties); + msg->setHandlerFuncFast(_PREHASH_ObjectPropertiesFamily, LLSelectMgr::processObjectPropertiesFamily); + msg->setHandlerFuncFast(_PREHASH_ForceObjectSelect, LLSelectMgr::processForceObjectSelect); - msg->setHandlerFuncFast(_PREHASH_MoneyBalanceReply, process_money_balance_reply, NULL); - msg->setHandlerFuncFast(_PREHASH_CoarseLocationUpdate, LLWorld::processCoarseUpdate, NULL); - msg->setHandlerFuncFast(_PREHASH_ReplyTaskInventory, LLViewerObject::processTaskInv, NULL); - msg->setHandlerFuncFast(_PREHASH_DerezContainer, process_derez_container, NULL); - msg->setHandlerFuncFast(_PREHASH_ScriptRunningReply, - &LLLiveLSLEditor::processScriptRunningReply); + msg->setHandlerFuncFast(_PREHASH_MoneyBalanceReply, process_money_balance_reply); + msg->setHandlerFuncFast(_PREHASH_CoarseLocationUpdate, LLWorld::processCoarseUpdate); + msg->setHandlerFuncFast(_PREHASH_ReplyTaskInventory, LLViewerObject::processTaskInv); + msg->setHandlerFuncFast(_PREHASH_DerezContainer, process_derez_container); + msg->setHandlerFuncFast(_PREHASH_ScriptRunningReply, LLLiveLSLEditor::processScriptRunningReply); - msg->setHandlerFuncFast(_PREHASH_DeRezAck, process_derez_ack); + msg->setHandlerFuncFast(_PREHASH_DeRezAck, process_derez_ack); - msg->setHandlerFunc("LogoutReply", process_logout_reply); + msg->setHandlerFuncFast(_PREHASH_LogoutReply, process_logout_reply); - //msg->setHandlerFuncFast(_PREHASH_AddModifyAbility, - // &LLAgent::processAddModifyAbility); - //msg->setHandlerFuncFast(_PREHASH_RemoveModifyAbility, - // &LLAgent::processRemoveModifyAbility); - msg->setHandlerFuncFast(_PREHASH_AgentDataUpdate, - &LLAgent::processAgentDataUpdate); - msg->setHandlerFuncFast(_PREHASH_AgentGroupDataUpdate, - &LLAgent::processAgentGroupDataUpdate); - msg->setHandlerFunc("AgentDropGroup", - &LLAgent::processAgentDropGroup); + //msg->setHandlerFuncFast(_PREHASH_AddModifyAbility, LLAgent::processAddModifyAbility); + //msg->setHandlerFuncFast(_PREHASH_RemoveModifyAbility, LLAgent::processRemoveModifyAbility); + msg->setHandlerFuncFast(_PREHASH_AgentDataUpdate, LLAgent::processAgentDataUpdate); + msg->setHandlerFuncFast(_PREHASH_AgentGroupDataUpdate, LLAgent::processAgentGroupDataUpdate); + msg->setHandlerFuncFast(_PREHASH_AgentDropGroup, LLAgent::processAgentDropGroup); // land ownership messages - msg->setHandlerFuncFast(_PREHASH_ParcelOverlay, - LLViewerParcelMgr::processParcelOverlay); - msg->setHandlerFuncFast(_PREHASH_ParcelProperties, - LLViewerParcelMgr::processParcelProperties); - msg->setHandlerFunc("ParcelAccessListReply", - LLViewerParcelMgr::processParcelAccessListReply); - msg->setHandlerFunc("ParcelDwellReply", - LLViewerParcelMgr::processParcelDwellReply); + msg->setHandlerFuncFast(_PREHASH_ParcelOverlay, LLViewerParcelMgr::processParcelOverlay); + msg->setHandlerFuncFast(_PREHASH_ParcelProperties, LLViewerParcelMgr::processParcelProperties); + msg->setHandlerFuncFast(_PREHASH_ParcelAccessListReply, LLViewerParcelMgr::processParcelAccessListReply); + msg->setHandlerFuncFast(_PREHASH_ParcelDwellReply, LLViewerParcelMgr::processParcelDwellReply); - msg->setHandlerFunc("AvatarPropertiesReply", - &LLAvatarPropertiesProcessor::processAvatarLegacyPropertiesReply); - msg->setHandlerFunc("AvatarInterestsReply", - &LLAvatarPropertiesProcessor::processAvatarInterestsReply); - msg->setHandlerFunc("AvatarGroupsReply", - &LLAvatarPropertiesProcessor::processAvatarGroupsReply); - msg->setHandlerFunc("AvatarNotesReply", - &LLAvatarPropertiesProcessor::processAvatarNotesReply); - msg->setHandlerFunc("AvatarPicksReply", - &LLAvatarPropertiesProcessor::processAvatarPicksReply); - msg->setHandlerFunc("AvatarClassifiedReply", - &LLAvatarPropertiesProcessor::processAvatarClassifiedsReply); + msg->setHandlerFuncFast(_PREHASH_AvatarPropertiesReply, LLAvatarPropertiesProcessor::processAvatarLegacyPropertiesReply); + msg->setHandlerFuncFast(_PREHASH_AvatarInterestsReply, LLAvatarPropertiesProcessor::processAvatarInterestsReply); + msg->setHandlerFuncFast(_PREHASH_AvatarGroupsReply, LLAvatarPropertiesProcessor::processAvatarGroupsReply); + msg->setHandlerFuncFast(_PREHASH_AvatarNotesReply, LLAvatarPropertiesProcessor::processAvatarNotesReply); + msg->setHandlerFuncFast(_PREHASH_AvatarPicksReply, LLAvatarPropertiesProcessor::processAvatarPicksReply); + msg->setHandlerFuncFast(_PREHASH_AvatarClassifiedReply, LLAvatarPropertiesProcessor::processAvatarClassifiedsReply); - msg->setHandlerFuncFast(_PREHASH_CreateGroupReply, - LLGroupMgr::processCreateGroupReply); - msg->setHandlerFuncFast(_PREHASH_JoinGroupReply, - LLGroupMgr::processJoinGroupReply); - msg->setHandlerFuncFast(_PREHASH_EjectGroupMemberReply, - LLGroupMgr::processEjectGroupMemberReply); - msg->setHandlerFuncFast(_PREHASH_LeaveGroupReply, - LLGroupMgr::processLeaveGroupReply); - msg->setHandlerFuncFast(_PREHASH_GroupProfileReply, - LLGroupMgr::processGroupPropertiesReply); + msg->setHandlerFuncFast(_PREHASH_CreateGroupReply, LLGroupMgr::processCreateGroupReply); + msg->setHandlerFuncFast(_PREHASH_JoinGroupReply, LLGroupMgr::processJoinGroupReply); + msg->setHandlerFuncFast(_PREHASH_EjectGroupMemberReply, LLGroupMgr::processEjectGroupMemberReply); + msg->setHandlerFuncFast(_PREHASH_LeaveGroupReply, LLGroupMgr::processLeaveGroupReply); + msg->setHandlerFuncFast(_PREHASH_GroupProfileReply, LLGroupMgr::processGroupPropertiesReply); // ratings deprecated - // msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply, - // LLFloaterRate::processReputationIndividualReply); - - msg->setHandlerFunc("ScriptControlChange", - LLAgent::processScriptControlChange ); + //msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply, LLFloaterRate::processReputationIndividualReply); - msg->setHandlerFuncFast(_PREHASH_ViewerEffect, LLHUDManager::processViewerEffect); + msg->setHandlerFuncFast(_PREHASH_ScriptControlChange, LLAgent::processScriptControlChange ); + msg->setHandlerFuncFast(_PREHASH_ViewerEffect, LLHUDManager::processViewerEffect); + msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers); + msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply, LLPanelGroupLandMoney::processGroupAccountSummaryReply); + msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply, LLPanelGroupLandMoney::processGroupAccountDetailsReply); + msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply, LLPanelGroupLandMoney::processGroupAccountTransactionsReply); - msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers); + msg->setHandlerFuncFast(_PREHASH_UserInfoReply, process_user_info_reply); - msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply, - LLPanelGroupLandMoney::processGroupAccountSummaryReply); - msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply, - LLPanelGroupLandMoney::processGroupAccountDetailsReply); - msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply, - LLPanelGroupLandMoney::processGroupAccountTransactionsReply); + msg->setHandlerFuncFast(_PREHASH_RegionHandshake, process_region_handshake); - msg->setHandlerFuncFast(_PREHASH_UserInfoReply, - process_user_info_reply); + msg->setHandlerFuncFast(_PREHASH_TeleportStart, process_teleport_start); + msg->setHandlerFuncFast(_PREHASH_TeleportProgress, process_teleport_progress); + msg->setHandlerFuncFast(_PREHASH_TeleportFailed, process_teleport_failed); + msg->setHandlerFuncFast(_PREHASH_TeleportLocal, process_teleport_local); - msg->setHandlerFunc("RegionHandshake", process_region_handshake, NULL); + msg->setHandlerFuncFast(_PREHASH_ImageNotInDatabase, LLViewerTextureList::processImageNotInDatabase); - msg->setHandlerFunc("TeleportStart", process_teleport_start ); - msg->setHandlerFunc("TeleportProgress", process_teleport_progress); - msg->setHandlerFunc("TeleportFailed", process_teleport_failed, NULL); - msg->setHandlerFunc("TeleportLocal", process_teleport_local, NULL); - - msg->setHandlerFunc("ImageNotInDatabase", LLViewerTextureList::processImageNotInDatabase, NULL); - - msg->setHandlerFuncFast(_PREHASH_GroupMembersReply, - LLGroupMgr::processGroupMembersReply); - msg->setHandlerFunc("GroupRoleDataReply", - LLGroupMgr::processGroupRoleDataReply); - msg->setHandlerFunc("GroupRoleMembersReply", - LLGroupMgr::processGroupRoleMembersReply); - msg->setHandlerFunc("GroupTitlesReply", - LLGroupMgr::processGroupTitlesReply); + msg->setHandlerFuncFast(_PREHASH_GroupMembersReply, LLGroupMgr::processGroupMembersReply); + msg->setHandlerFuncFast(_PREHASH_GroupRoleDataReply, LLGroupMgr::processGroupRoleDataReply); + msg->setHandlerFuncFast(_PREHASH_GroupRoleMembersReply, LLGroupMgr::processGroupRoleMembersReply); + msg->setHandlerFuncFast(_PREHASH_GroupTitlesReply, LLGroupMgr::processGroupTitlesReply); // Special handler as this message is sometimes used for group land. - msg->setHandlerFunc("PlacesReply", process_places_reply); - msg->setHandlerFunc("GroupNoticesListReply", LLPanelGroupNotices::processGroupNoticesListReply); + msg->setHandlerFuncFast(_PREHASH_PlacesReply, process_places_reply); + msg->setHandlerFuncFast(_PREHASH_GroupNoticesListReply, LLPanelGroupNotices::processGroupNoticesListReply); - msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply); + msg->setHandlerFuncFast(_PREHASH_AvatarPickerReply, LLFloaterAvatarPicker::processAvatarPickerReply); - 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->setHandlerFuncFast(_PREHASH_DirPlacesReply, LLPanelDirBrowser::processDirPlacesReply); + msg->setHandlerFuncFast(_PREHASH_DirPeopleReply, LLPanelDirBrowser::processDirPeopleReply); + msg->setHandlerFuncFast(_PREHASH_DirEventsReply, LLPanelDirBrowser::processDirEventsReply); + msg->setHandlerFuncFast(_PREHASH_DirGroupsReply, LLPanelDirBrowser::processDirGroupsReply); + msg->setHandlerFuncFast(_PREHASH_DirClassifiedReply, LLPanelDirBrowser::processDirClassifiedReply); + msg->setHandlerFuncFast(_PREHASH_DirLandReply, LLPanelDirBrowser::processDirLandReply); - msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply); - msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); - msg->setHandlerFunc("EventInfoReply", LLEventNotifier::processEventInfoReply); + msg->setHandlerFuncFast(_PREHASH_MapBlockReply, LLWorldMapMessage::processMapBlockReply); + msg->setHandlerFuncFast(_PREHASH_MapItemReply, LLWorldMapMessage::processMapItemReply); + msg->setHandlerFuncFast(_PREHASH_EventInfoReply, LLEventNotifier::processEventInfoReply); - msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply); - msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply); - msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply); - msg->setHandlerFunc("ScriptDialog", process_script_dialog); - msg->setHandlerFunc("LoadURL", process_load_url); - msg->setHandlerFunc("ScriptTeleportRequest", process_script_teleport_request); - msg->setHandlerFunc("EstateCovenantReply", process_covenant_reply); + msg->setHandlerFuncFast(_PREHASH_PickInfoReply, LLAvatarPropertiesProcessor::processPickInfoReply); + msg->setHandlerFuncFast(_PREHASH_ClassifiedInfoReply, LLAvatarPropertiesProcessor::processClassifiedInfoReply); + msg->setHandlerFuncFast(_PREHASH_ParcelInfoReply, LLRemoteParcelInfoProcessor::processParcelInfoReply); + msg->setHandlerFuncFast(_PREHASH_ScriptDialog, process_script_dialog); + msg->setHandlerFuncFast(_PREHASH_LoadURL, process_load_url); + msg->setHandlerFuncFast(_PREHASH_ScriptTeleportRequest, process_script_teleport_request); + msg->setHandlerFuncFast(_PREHASH_EstateCovenantReply, process_covenant_reply); // calling cards - msg->setHandlerFunc("OfferCallingCard", process_offer_callingcard); - msg->setHandlerFunc("AcceptCallingCard", process_accept_callingcard); - msg->setHandlerFunc("DeclineCallingCard", process_decline_callingcard); + msg->setHandlerFuncFast(_PREHASH_OfferCallingCard, process_offer_callingcard); + msg->setHandlerFuncFast(_PREHASH_AcceptCallingCard, process_accept_callingcard); + msg->setHandlerFuncFast(_PREHASH_DeclineCallingCard, process_decline_callingcard); - msg->setHandlerFunc("ParcelObjectOwnersReply", LLPanelLandObjects::processParcelObjectOwnersReply); + msg->setHandlerFuncFast(_PREHASH_ParcelObjectOwnersReply, LLPanelLandObjects::processParcelObjectOwnersReply); - msg->setHandlerFunc("InitiateDownload", process_initiate_download); - msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply); - msg->setHandlerFunc("GenericMessage", process_generic_message); - msg->setHandlerFunc("GenericStreamingMessage", process_generic_streaming_message); - msg->setHandlerFunc("LargeGenericMessage", process_large_generic_message); + msg->setHandlerFuncFast(_PREHASH_InitiateDownload, process_initiate_download); + msg->setHandlerFuncFast(_PREHASH_LandStatReply, LLFloaterTopObjects::handle_land_reply); + msg->setHandlerFuncFast(_PREHASH_GenericMessage, process_generic_message); + msg->setHandlerFuncFast(_PREHASH_GenericStreamingMessage, process_generic_streaming_message); + msg->setHandlerFuncFast(_PREHASH_LargeGenericMessage, process_large_generic_message); - msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message); + msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message); } void asset_callback_nothing(const LLUUID&, LLAssetType::EType, void*, S32) @@ -3761,6 +3806,14 @@ bool init_benefits(LLSD& response) return succ; } +// HTTP LOGIN RESPONSE PROCESSING +// Called after successful HTTP XMLRPC authentication. Extracts critical data +// from LoginServer response needed to establish the UDP connection: +// - agent_id, session_id, secure_session_id (authentication tokens) +// - circuit_code (used in UseCircuitCode UDP message) +// - sim_ip, sim_port (simulator address for UDP circuit) +// - seed_capability (URL for fetching HTTP capability endpoints) +// bool process_login_success_response() { LLSD response = LLLoginInstance::getInstance()->getResponse(); @@ -3883,6 +3936,8 @@ bool process_login_success_response() gAgentStartLocation.assign(text); } + // Extract UDP circuit parameters from login response. + // These are used in STATE_WORLD_INIT to establish the UDP circuit. text = response["circuit_code"].asString(); if(!text.empty()) { diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index ff7692e5e9..a6c2a8dc63 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -146,6 +146,7 @@ LLStatusBar::~LLStatusBar() // virtual void LLStatusBar::draw() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; refresh(); LLPanel::draw(); } diff --git a/indra/newview/llsyntaxid.cpp b/indra/newview/llsyntaxid.cpp index f89ae00c5b..58d1287979 100644 --- a/indra/newview/llsyntaxid.cpp +++ b/indra/newview/llsyntaxid.cpp @@ -35,39 +35,59 @@ #include "llviewerregion.h" #include "llcorehttputil.h" + //----------------------------------------------------------------------------- // LLSyntaxIdLSL //----------------------------------------------------------------------------- -const std::string SYNTAX_ID_CAPABILITY_NAME = "LSLSyntax"; -const std::string SYNTAX_ID_SIMULATOR_FEATURE = "LSLSyntaxId"; -const std::string FILENAME_DEFAULT = "keywords_lsl_default.xml"; +namespace +{ + const std::string SYNTAX_ID_CAPABILITY_NAME = "LSLSyntax"; + const std::string SYNTAX_DEF_CAPABILITY_NAME = "ScriptDefinitions"; + const std::string SYNTAX_ID_SIMULATOR_FEATURE = "LSLSyntaxId"; + const std::string FILENAME_INTERNAL_LSL = "lsl_keywords.xml"; + const std::string FILENAME_INTERNAL_LUA = "lua_keywords.xml"; + const std::string FILENAME_DEFAULT_LSL = "keywords_lsl_default.xml"; + const std::string FILENAME_DEFAULT_LUA = "keywords_lua_default.xml"; -/** - * @brief LLSyntaxIdLSL constructor - */ -LLSyntaxIdLSL::LLSyntaxIdLSL() -: mKeywordsXml(LLSD()) -, mCapabilityURL(std::string()) -, mFilePath(LL_PATH_APP_SETTINGS) -, mSyntaxId(LLUUID()) -, mInitialized(false) + constexpr U32 LLSD_SYNTAX_LSL_VERSION_EXPECTED = 2; + const std::string LLSD_SYNTAX_LSL_VERSION_KEY("llsd-lsl-syntax-version"); + + const std::unordered_set<std::string> MEMCACHED_LLSD = { + FILENAME_INTERNAL_LSL, + FILENAME_INTERNAL_LUA + }; +} // namespace + +//======================================================================== +void LLSyntaxDefCache::initSingleton() { - loadDefaultKeywordsIntoLLSD(); - mRegionChangedCallback = gAgent.addRegionChangedCallback(boost::bind(&LLSyntaxIdLSL::handleRegionChanged, this)); + buildDefaultCache(); + loadKeywordsIntoLLSD(); + mRegionChangedCallback = gAgent.addRegionChangedCallback(boost::bind(&LLSyntaxDefCache::handleRegionChanged, this)); handleRegionChanged(); // Kick off an initial caps query and fetch } -void LLSyntaxIdLSL::buildFullFileSpec() +void LLSyntaxDefCache::cleanupSingleton() { - ELLPath path = mSyntaxId.isNull() ? LL_PATH_APP_SETTINGS : LL_PATH_CACHE; - const std::string filename = mSyntaxId.isNull() ? FILENAME_DEFAULT : "keywords_lsl_" + mSyntaxId.asString() + ".llsd.xml"; - mFullFileSpec = gDirUtilp->getExpandedFilename(path, filename); + gAgent.removeRegionChangedCallback(mRegionChangedCallback); + mLSLKeywords = LLSD(); + mLuaKeywords = LLSD(); + mCapabilityURL = std::string(); + mSyntaxId = LLUUID(); + mFileCachePaths.clear(); } -//----------------------------------------------------------------------------- -// syntaxIdChange() -//----------------------------------------------------------------------------- -bool LLSyntaxIdLSL::syntaxIdChanged() +boost::signals2::connection LLSyntaxDefCache::addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb) +{ + return mSyntaxIDChangedSignal.connect(cb); +} + +//======================================================================== +// checkSyntaxId() +// Checks the current region for the LSLSyntaxId feature and capability, and +// if found checks the syntax ID against the one we have. If they differ, +// updates the syntax ID and returns true. Otherwise returns false. +bool LLSyntaxDefCache::updateSyntaxId() { LLViewerRegion* region = gAgent.getRegion(); @@ -82,51 +102,97 @@ bool LLSyntaxIdLSL::syntaxIdChanged() { // get and check the hash LLUUID new_syntax_id = sim_features[SYNTAX_ID_SIMULATOR_FEATURE].asUUID(); - mCapabilityURL = region->getCapability(SYNTAX_ID_CAPABILITY_NAME); + + // *Note* the syntax ID may not have changed, but the region almost certainly has. + // update the cap URL + mCapabilityURL = region->getCapability(SYNTAX_DEF_CAPABILITY_NAME); + mUseDefsCap = !mCapabilityURL.empty(); + if (!mUseDefsCap) + { + mCapabilityURL = region->getCapability(SYNTAX_ID_CAPABILITY_NAME); + } LL_DEBUGS("SyntaxLSL") << SYNTAX_ID_SIMULATOR_FEATURE << " capability URL: " << mCapabilityURL << LL_ENDL; + if (new_syntax_id != mSyntaxId) { LL_DEBUGS("SyntaxLSL") << "New SyntaxID '" << new_syntax_id << "' found." << LL_ENDL; mSyntaxId = new_syntax_id; return true; } - else - LL_DEBUGS("SyntaxLSL") << "SyntaxID matches what we have." << LL_ENDL; + + LL_DEBUGS("SyntaxLSL") << "SyntaxID has not changed. Still " << mSyntaxId << LL_ENDL; } } else { - region->setCapabilitiesReceivedCallback(boost::bind(&LLSyntaxIdLSL::handleCapsReceived, this, _1)); + region->setCapabilitiesReceivedCallback(boost::bind(&LLSyntaxDefCache::handleCapsReceived, this, _1)); LL_DEBUGS("SyntaxLSL") << "Region has not received capabilities. Waiting for caps..." << LL_ENDL; } } return false; } +void LLSyntaxDefCache::handleRegionChanged() +{ + if (updateSyntaxId()) + { + if (!checkCacheAndLoad(mSyntaxId)) + { + fetchKeywords(); + } + } +} + +void LLSyntaxDefCache::handleCapsReceived(const LLUUID& region_uuid) +{ + LLViewerRegion* current_region = gAgent.getRegion(); + + if (region_uuid.notNull() && current_region->getRegionID() == region_uuid) + { + updateSyntaxId(); + if (!checkCacheAndLoad(mSyntaxId)) + { + fetchKeywords(); + } + } +} + //----------------------------------------------------------------------------- -// fetchKeywordsFile -//----------------------------------------------------------------------------- -void LLSyntaxIdLSL::fetchKeywordsFile(const std::string& filespec) +// fetchKeywords +// Initiates a fetch of the current language definitions from the region caps. +void LLSyntaxDefCache::fetchKeywords() { - LLCoros::instance().launch("LLSyntaxIdLSL::fetchKeywordsFileCoro", - boost::bind(&LLSyntaxIdLSL::fetchKeywordsFileCoro, this, mCapabilityURL, filespec)); - LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is: " << mCapabilityURL << ". Filename to use is: '" << filespec << "'." << LL_ENDL; + if (mCapabilityURL.empty()) + { + LL_WARNS("SyntaxLSL") << "No capability URL for fetching syntax definitions." << LL_ENDL; + return; + } + if (mUseDefsCap) + { + LLCoros::instance().launch("LLSyntaxDefCache::fetchKeywordsDefsCoro", + boost::bind(&LLSyntaxDefCache::fetchKeywordsDefsCoro, this, mCapabilityURL, mSyntaxId)); + } + else + { + LLCoros::instance().launch("LLSyntaxDefCache::fetchKeywordsFileCoro", + boost::bind(&LLSyntaxDefCache::fetchKeywordsFileCoro, this, mCapabilityURL, mSyntaxId)); + } } //----------------------------------------------------------------------------- // fetchKeywordsFileCoro -//----------------------------------------------------------------------------- -void LLSyntaxIdLSL::fetchKeywordsFileCoro(std::string url, std::string fileSpec) +// This uses the legacy language cap which only sends the LSL keywords file. +void LLSyntaxDefCache::fetchKeywordsFileCoro(std::string url, LLUUID syntax_id) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t 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); + auto insrt = mInflightFetches.insert(syntax_id); if (!insrt.second) { - LL_WARNS("SyntaxLSL") << "Already downloading keyword file called \"" << fileSpec << "\"." << LL_ENDL; + LL_WARNS("SyntaxLSL") << "Already downloading keyword file for syntax ID \"" << syntax_id << "\"." << LL_ENDL; return; } @@ -135,11 +201,11 @@ void LLSyntaxIdLSL::fetchKeywordsFileCoro(std::string url, std::string fileSpec) LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - mInflightFetches.erase(fileSpec); + mInflightFetches.erase(syntax_id); if (!status) { - LL_WARNS("SyntaxLSL") << "Failed to fetch syntax file \"" << fileSpec << "\"" << LL_ENDL; + LL_WARNS("SyntaxLSL") << "Failed to fetch syntax file for syntax ID \"" << syntax_id << "\"" << LL_ENDL; return; } @@ -147,9 +213,39 @@ void LLSyntaxIdLSL::fetchKeywordsFileCoro(std::string url, std::string fileSpec) if (isSupportedVersion(result)) { - setKeywordsXml(result); - cacheFile(fileSpec, result); - loadKeywordsIntoLLSD(); + std::string path = buildCacheDirectoryName(syntax_id); + + if (!LLFile::exists(path)) + { + LL_DEBUGS("SyntaxLSL") << "Cache directory '" << path << "' does not exist. Attempting to create." << LL_ENDL; + if (LLFile::mkdir(path)) + { + LL_WARNS("SyntaxLSL") << "Failed to create cache directory '" << path << "'. Cannot cache syntax defs file." << LL_ENDL; + return; + } + } + + // Note that after this call the file cache will have all well known files pointing + // to the default versions, so below, where we get the path to the lua keywords + // well be loading the default version. + buildDefaultCache(); + + // The LSL keywords we just received + std::string full_path = gDirUtilp->add(path, FILENAME_INTERNAL_LSL); + if (writeCacheFile(full_path, result)) + { + mFileCachePaths.addNamePath(FILENAME_INTERNAL_LSL, full_path); + } + // We need to manually load the Lua keywords + full_path = mFileCachePaths.getPath(FILENAME_INTERNAL_LUA); + LLSD lua_defs = loadDeserializedCacheFile(full_path); + + setKeywords(result, lua_defs); + + // Shuttle this task to the main coro/worker. + LLAppViewer::instance()->postToMainCoro([this]() { + mSyntaxIDChangedSignal(); + }); } else { @@ -158,73 +254,212 @@ void LLSyntaxIdLSL::fetchKeywordsFileCoro(std::string url, std::string fileSpec) } -//----------------------------------------------------------------------------- -// cacheFile -//----------------------------------------------------------------------------- -void LLSyntaxIdLSL::cacheFile(const std::string &fileSpec, const LLSD& content_ref) +void LLSyntaxDefCache::fetchKeywordsDefsCoro(std::string url, LLUUID syntax_id) { - std::stringstream str; - LLSDSerialize::toXML(content_ref, str); - const std::string xml = str.str(); + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("fetchKeywordsDefsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); - // save the str to disk, usually to the cache. - llofstream file(fileSpec.c_str(), std::ios_base::out); - file.write(xml.c_str(), str.str().size()); - file.close(); + static std::set<LLUUID> inflightDefsFetches; + auto insrt = inflightDefsFetches.insert(syntax_id); + //auto insrt = mInflightFetches.insert(syntax_id); + if (!insrt.second) + { + LL_WARNS("SyntaxLSL") << "Already downloading keyword defs for \"" << syntax_id << "\"." << LL_ENDL; + return; + } - LL_DEBUGS("SyntaxLSL") << "Syntax file received, saving as: '" << fileSpec << "'" << LL_ENDL; -} + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); -//----------------------------------------------------------------------------- -// initialize -//----------------------------------------------------------------------------- -void LLSyntaxIdLSL::initialize() -{ - if(mInitialized) return; - if (mSyntaxId.isNull()) + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + inflightDefsFetches.erase(syntax_id); + + if (!status) { - loadDefaultKeywordsIntoLLSD(); + LL_WARNS("SyntaxLSL") << "Failed to fetch syntax file \"" << syntax_id << "\"" << LL_ENDL; + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + return; } - else if (!mCapabilityURL.empty()) + + // Now we need to walk through the returned LLSD. It consists of a map keyed on the file name containing a binary + // blob of the actual file contents. + LLSD files = result["files"]; + // A region may omit definitions for languages it does not support. Keep + // the defaults/current definitions for any omitted file. + LLSD lsl_keywords = mLSLKeywords; + LLSD lua_keywords = mLuaKeywords; + if (files.isMap()) { - LL_DEBUGS("SyntaxLSL") << "LSL version has changed, getting appropriate file." << LL_ENDL; + std::string path = buildCacheDirectoryName(syntax_id); - // Need a full spec regardless of file source, so build it now. - buildFullFileSpec(); - if (mSyntaxId.notNull()) + if (!LLFile::exists(path)) { - if (!gDirUtilp->fileExists(mFullFileSpec)) - { // Does not exist, so fetch it from the capability - LL_DEBUGS("SyntaxLSL") << "LSL syntax not cached, attempting download." << LL_ENDL; - fetchKeywordsFile(mFullFileSpec); - } - else + LL_DEBUGS("SyntaxLSL") << "Cache directory '" << path << "' does not exist. Attempting to create." << LL_ENDL; + if (LLFile::mkdir(path)) { - LL_DEBUGS("SyntaxLSL") << "Found cached Syntax file: " << mFullFileSpec << " Loading keywords." << LL_ENDL; - loadKeywordsIntoLLSD(); + LL_WARNS("SyntaxLSL") << "Failed to create cache directory '" << path << "'. Cannot cache syntax defs file." << LL_ENDL; + return; } } - else + + buildDefaultCache(); + + for (const auto &[filename, contents] : llsd::inMap(files)) { - LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId is null. Loading default values" << LL_ENDL; - loadDefaultKeywordsIntoLLSD(); + std::string full_path = gDirUtilp->add(path, filename); + + if (filename == FILENAME_INTERNAL_LSL) + { + lsl_keywords = contents; + } + else if (filename == FILENAME_INTERNAL_LUA) + { + lua_keywords = contents; + } + + if (writeCacheFile(full_path, contents)) + { + mFileCachePaths.addNamePath(filename, full_path); + } } } else { - LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is empty." << LL_ENDL; - loadDefaultKeywordsIntoLLSD(); + LL_WARNS("SyntaxLSL") << "Malformed syntax defs response, missing 'files' map." << LL_ENDL; } - mInitialized = true; + + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + + setKeywords(lsl_keywords, lua_keywords); + LLAppViewer::instance()->postToMainCoro( + [this]() + { + mSyntaxIDChangedSignal(); + }); +} + +//----------------------------------------------------------------------------- +// buildCache +// Constructs the cache file paths for the given syntax ID. If the syntax ID is null, +// constructs the default cache file paths. +void LLSyntaxDefCache::buildCachePaths(const LLUUID &syntax_id) +{ + if (syntax_id.notNull()) + { // Initialize the cache files to point to the default files + buildCachePaths(LLUUID::null); + } + else + { + mFileCachePaths.clear(); + mFileCachePaths.addNamePath( + FILENAME_INTERNAL_LSL, + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, FILENAME_DEFAULT_LSL)); + mFileCachePaths.addNamePath( + FILENAME_INTERNAL_LUA, + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, FILENAME_DEFAULT_LUA)); + return; + } + + std::string cache_dir = buildCacheDirectoryName(syntax_id); + if (!LLFile::exists(cache_dir)) + { + LL_DEBUGS("SyntaxLSL") << "Cache directory '" << cache_dir << "' does not exist." << LL_ENDL; + return; + } + + auto files = gDirUtilp->getFilesInDir(cache_dir); + for (const auto &file : files) + { + mFileCachePaths.addNamePath(file, gDirUtilp->add(cache_dir, file)); + } +} + +bool LLSyntaxDefCache::writeCacheFile(const std::string &fileSpec, const LLSD& content_ref) +{ + bool binary(content_ref.isBinary()); + std::ios_base::openmode mode(binary ? (std::ios_base::out | std::ios_base::binary) + : std::ios_base::out); + std::ofstream file(fileSpec.c_str(), mode); + + if (!file.is_open()) + { + LL_WARNS("SyntaxLSL") << "Failed to open file for writing: '" << fileSpec << "'" << LL_ENDL; + return false; + } + + if (binary) + { + LL_DEBUGS("SyntaxLSL") << "Caching raw content to '" << fileSpec << "'" << LL_ENDL; + file.write((const char*)content_ref.asBinary().data(), content_ref.asBinary().size()); + } + else + { + LL_DEBUGS("SyntaxLSL") << "Caching XML content to '" << fileSpec << "'" << LL_ENDL; + LLSDSerialize::serialize(content_ref, file, LLSDSerialize::LLSD_XML, LLSDFormatter::OPTIONS_PRETTY); + } + file.close(); + + if (!file.good()) + { + LL_WARNS("SyntaxLSL") << "Failed to write content to file: '" << fileSpec << "'" << LL_ENDL; + return false; + } + return true; +} + +//----------------------------------------------------------------------------- +// checkCacheAndLoad +// Tests the local cache for the given syntax ID. If found it loads the keywords +// from the cache into LLSD and returns true. Otherwise returns false. +bool LLSyntaxDefCache::checkCacheAndLoad(const LLUUID& syntax_id) +{ + if (checkLocalCache(syntax_id)) + { + buildCachePaths(syntax_id); + loadKeywordsIntoLLSD(); + return true; + } + return false; +} + +std::string LLSyntaxDefCache::buildCacheDirectoryName(const LLUUID& syntax_id) +{ + if (syntax_id.isNull()) + { + LL_DEBUGS("SyntaxLSL") << "No SyntaxID, using app settings directory." << LL_ENDL; + return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "syntax_default"); + } + else + { + LL_DEBUGS("SyntaxLSL") << "Using cache directory for SyntaxID '" << syntax_id << "'." << LL_ENDL; + std::string cache_dir_name = "syntax_" + syntax_id.asString(); + + return gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name); + } +} + +bool LLSyntaxDefCache::checkLocalCache(const LLUUID& syntax_id) const +{ + if (syntax_id.isNull()) + { // Cache check will always fail if we don't have a valid SyntaxID, so skip it in that case. + LL_DEBUGS("SyntaxLSL") << "No SyntaxID, skipping local cache check." << LL_ENDL; + return false; + } + + // Check for the existence of the cache directory for this syntax ID. If it doesn't exist, then we don't have a cached file. + std::string cache_dir = buildCacheDirectoryName(syntax_id); + return gDirUtilp->fileExists(cache_dir); } + //----------------------------------------------------------------------------- // isSupportedVersion //----------------------------------------------------------------------------- -const U32 LLSD_SYNTAX_LSL_VERSION_EXPECTED = 2; -const std::string LLSD_SYNTAX_LSL_VERSION_KEY("llsd-lsl-syntax-version"); -bool LLSyntaxIdLSL::isSupportedVersion(const LLSD& content) +bool LLSyntaxDefCache::isSupportedVersion(const LLSD& content) { bool is_valid = false; /* @@ -250,78 +485,100 @@ bool LLSyntaxIdLSL::isSupportedVersion(const LLSD& content) } //----------------------------------------------------------------------------- -// loadDefaultKeywordsIntoLLSD() -//----------------------------------------------------------------------------- -void LLSyntaxIdLSL::loadDefaultKeywordsIntoLLSD() -{ - mSyntaxId.setNull(); - buildFullFileSpec(); - loadKeywordsIntoLLSD(); -} - -//----------------------------------------------------------------------------- -// loadKeywordsFileIntoLLSD +// loadKeywordsIntoLLSD //----------------------------------------------------------------------------- /** * @brief Load xml serialized LLSD - * @desc Opens the specified filespec and attempts to deserializes the - * contained data to the specified LLSD object. indicate success/failure with - * sLoaded/sLoadFailed members. + * @desc Open the internal lsl keywords files and deserialize them into the correct + * members. */ -void LLSyntaxIdLSL::loadKeywordsIntoLLSD() +void LLSyntaxDefCache::loadKeywordsIntoLLSD() { - LLSD content; - llifstream file; - file.open(mFullFileSpec.c_str()); - if (file.is_open()) + for (auto& filename : MEMCACHED_LLSD) { - if (LLSDSerialize::fromXML(content, file) != LLSDParser::PARSE_FAILURE) + // Note, in the case of the legacy language cap (it only delivers the LSL keywords file) + // The mFileCachePaths will have been initialized in such a way that the Lua keywords + // point to the default file. + std::string full_path = mFileCachePaths.getPath(filename); + if (!full_path.empty()) { - if (isSupportedVersion(content)) + LLSD content = loadDeserializedCacheFile(full_path); + if (!content.isUndefined() && isSupportedVersion(content)) { - LL_DEBUGS("SyntaxLSL") << "Deserialized: " << mFullFileSpec << LL_ENDL; + LL_DEBUGS("SyntaxLSL") << "Deserialized cached file: " << full_path << LL_ENDL; + if (filename == FILENAME_INTERNAL_LSL) + { + mLSLKeywords = content; + } + else if (filename == FILENAME_INTERNAL_LUA) + { + mLuaKeywords = content; + } } else { - LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file." << LL_ENDL; + LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file " << full_path << "." << LL_ENDL; } } } - else - { - LL_WARNS("SyntaxLSL") << "Failed to open: " << mFullFileSpec << LL_ENDL; - } - mKeywordsXml = content; + mSyntaxIDChangedSignal(); } -bool LLSyntaxIdLSL::keywordFetchInProgress() +std::vector<std::string> LLSyntaxDefCache::getCacheFileNames() const { - return !mInflightFetches.empty(); + std::vector<std::string> names; + for (const auto& [name, path] : mFileCachePaths) + { + names.push_back(name); + } + return names; } -void LLSyntaxIdLSL::handleRegionChanged() +LLSD LLSyntaxDefCache::loadDeserializedCacheFile(const std::string& file_path) { - if (syntaxIdChanged()) + std::ifstream file(file_path.c_str()); + if (file.good()) + { + LLSD content; + if (LLSDSerialize::deserialize(content, file, -1)) + { + return content; + } + } + else { - buildFullFileSpec(); - fetchKeywordsFile(mFullFileSpec); - mInitialized = false; + LL_WARNS("SyntaxLSL") << "Failed to open cached file: " << file_path << LL_ENDL; } + return LLSD(); } -void LLSyntaxIdLSL::handleCapsReceived(const LLUUID& region_uuid) +std::string LLSyntaxDefCache::loadCacheFile(const std::string& name) const { - LLViewerRegion* current_region = gAgent.getRegion(); - - if (region_uuid.notNull() - && current_region->getRegionID() == region_uuid) + std::string full_path = mFileCachePaths.getPath(name); + if (!full_path.empty()) { - syntaxIdChanged(); + std::ifstream file(full_path.c_str()); + if (file.good()) + { + std::ostringstream ss; + ss << file.rdbuf(); + return (file.good()) ? ss.str() : std::string(); + } + else + { + LL_WARNS("SyntaxLSL") << "Failed to open cached file: " << full_path << LL_ENDL; + } } + return std::string(); } -boost::signals2::connection LLSyntaxIdLSL::addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb) +LLSD LLSyntaxDefCache::loadCacheFileAsLLSD(const std::string& name) const { - return mSyntaxIDChangedSignal.connect(cb); + std::string full_path = mFileCachePaths.getPath(name); + if (!full_path.empty()) + { + return loadDeserializedCacheFile(full_path); + } + return LLSD(); } diff --git a/indra/newview/llsyntaxid.h b/indra/newview/llsyntaxid.h index a00e9d6390..acf8020d58 100644 --- a/indra/newview/llsyntaxid.h +++ b/indra/newview/llsyntaxid.h @@ -25,8 +25,7 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ -#ifndef LL_SYNTAXID_H -#define LL_SYNTAXID_H +#pragma once #include "llviewerprecompiledheaders.h" @@ -34,44 +33,117 @@ #include "lleventcoro.h" #include "llcoros.h" -class fetchKeywordsFileResponder; - -class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL> +class LLSyntaxDefCache : public LLSingleton<LLSyntaxDefCache> { - LLSINGLETON(LLSyntaxIdLSL); - friend class fetchKeywordsFileResponder; + LLSINGLETON(LLSyntaxDefCache) = default; + +public: + using syntax_id_changed_signal_t = boost::signals2::signal<void()>; + using syntax_id_changed_h = boost::signals2::connection; + class cache_names_t + { + public: + using name_path_map_t = std::unordered_map<std::string, std::string>; + using iterator = name_path_map_t::iterator; + using const_iterator = name_path_map_t::const_iterator; + + cache_names_t() = default; + ~cache_names_t() = default; + + std::string getPath(const std::string &name) const + { + auto it = mNamePathMap.find(name); + if (it != mNamePathMap.end()) + { + return it->second; + } + return std::string(); + } + + bool hasName(const std::string &name) const + { + return mNamePathMap.find(name) != mNamePathMap.end(); + } + + void addNamePath(const std::string &name, const std::string &path) + { + mNamePathMap[name] = path; + } + + iterator begin() { return mNamePathMap.begin(); } + const_iterator begin() const { return mNamePathMap.begin(); } + iterator end() { return mNamePathMap.end(); } + const_iterator end() const { return mNamePathMap.end(); } + + size_t size() const { return mNamePathMap.size(); } + void clear() { mNamePathMap.clear(); } + bool empty() const { return mNamePathMap.empty(); } + + iterator find(const std::string &name) { return mNamePathMap.find(name); } + const_iterator find(const std::string &name) const { return mNamePathMap.find(name); } + + private: + name_path_map_t mNamePathMap; + }; + + bool keywordFetchInProgress() const { return !mInflightFetches.empty(); } + LLSD getLSLKeywords() const { return mLSLKeywords; }; + LLSD getLuaKeywords() const { return mLuaKeywords; }; + LLUUID getSyntaxID() const { return mSyntaxId; } + syntax_id_changed_h addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb); + + bool checkCacheAndLoad(const LLUUID& syntax_id); + + static std::string buildCacheDirectoryName(const LLUUID& syntax_id); + + using const_iterator = cache_names_t::const_iterator; + + const_iterator begin() const { return mFileCachePaths.begin(); } + const_iterator end() const { return mFileCachePaths.end(); } + + size_t size() const { return mFileCachePaths.size(); } + bool empty() const { return mFileCachePaths.empty(); } + + const_iterator find(const std::string& name) const { return mFileCachePaths.find(name); } + + std::vector<std::string> getCacheFileNames() const; + bool hasCacheFile(const std::string& name) const { return mFileCachePaths.hasName(name); } + std::string loadCacheFile(const std::string& name) const; + LLSD loadCacheFileAsLLSD(const std::string& name) const; + +protected: + void initSingleton() override; + void cleanupSingleton() override; private: - std::set<std::string> mInflightFetches; - typedef boost::signals2::signal<void()> syntax_id_changed_signal_t; - syntax_id_changed_signal_t mSyntaxIDChangedSignal; - boost::signals2::connection mRegionChangedCallback; - bool syntaxIdChanged(); - bool isSupportedVersion(const LLSD& content); - void handleRegionChanged(); - void handleCapsReceived(const LLUUID& region_uuid); - void setKeywordsXml(const LLSD& content) { mKeywordsXml = content; }; - void buildFullFileSpec(); - void fetchKeywordsFile(const std::string& filespec); - void loadDefaultKeywordsIntoLLSD(); - void loadKeywordsIntoLLSD(); + bool updateSyntaxId(); + static bool isSupportedVersion(const LLSD& content); + void handleRegionChanged(); + void handleCapsReceived(const LLUUID& region_uuid); + void setKeywords(const LLSD& lsl, const LLSD& lua) { mLSLKeywords = lsl; mLuaKeywords = lua; }; - void fetchKeywordsFileCoro(std::string url, std::string fileSpec); - void cacheFile(const std::string &fileSpec, const LLSD& content_ref); + void loadKeywordsIntoLLSD(); - std::string mCapabilityURL; - std::string mFullFileSpec; - ELLPath mFilePath; - LLUUID mSyntaxId; - LLSD mKeywordsXml; - bool mInitialized; + void fetchKeywords(); + void fetchKeywordsFileCoro(std::string url, LLUUID syntax_id); + void fetchKeywordsDefsCoro(std::string url, LLUUID syntax_id); -public: - void initialize(); - bool keywordFetchInProgress(); - LLSD getKeywordsXML() const { return mKeywordsXml; }; - boost::signals2::connection addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb); -}; + bool checkLocalCache(const LLUUID& syntax_id) const; + void buildDefaultCache() { buildCachePaths(LLUUID::null); } + void buildCachePaths(const LLUUID &syntax_id); + bool writeCacheFile(const std::string &fileSpec, const LLSD& content_ref); -#endif // LLSYNTAXID_H + static LLSD loadDeserializedCacheFile(const std::string& file_path); + + std::set<LLUUID> mInflightFetches; + syntax_id_changed_signal_t mSyntaxIDChangedSignal; + syntax_id_changed_h mRegionChangedCallback; + + std::string mCapabilityURL; + cache_names_t mFileCachePaths; + LLUUID mSyntaxId; + LLSD mLSLKeywords; + LLSD mLuaKeywords; + bool mUseDefsCap{ false }; +}; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 8c8734b52f..f6ba52365b 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -157,7 +157,7 @@ protected: LLAtomicS32 mBytesRead; }; -class LLTextureCacheLocalFileWorker : public LLTextureCacheWorker +class LLTextureCacheLocalFileWorker final : public LLTextureCacheWorker { public: LLTextureCacheLocalFileWorker(LLTextureCache* cache, const std::string& filename, const LLUUID& id, @@ -165,7 +165,7 @@ public: S32 imagesize, // for writes LLTextureCache::Responder* responder) : LLTextureCacheWorker(cache, id, data, datasize, offset, imagesize, responder), - mFileName(filename) + mFileName(fsyspath(filename)) { } @@ -174,19 +174,24 @@ public: virtual bool doWrite(); private: - std::string mFileName; + std::filesystem::path mFileName; }; bool LLTextureCacheLocalFileWorker::doRead() { LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; - S32 local_size = LLAPRFile::size(mFileName, mCache->getLocalAPRFilePool()); - - if (local_size > 0 && mFileName.size() > 4) + S32 local_size = (S32)LLFile::size(mFileName); + if (local_size > 0 && mFileName.native().size() > 4) { mDataSize = local_size; // Only a complete file is valid - std::string extension = mFileName.substr(mFileName.size() - 3, 3); +#if LL_WINDOWS + std::wstring_view native_path = mFileName.native(); + std::wstring_view extension = native_path.substr(native_path.size() - 3, 3); +#else + std::string_view native_path = mFileName.native(); + std::string_view extension = native_path.substr(native_path.size() - 3, 3); +#endif mImageFormat = LLImageBase::getCodecFromExtension(extension); @@ -210,8 +215,7 @@ bool LLTextureCacheLocalFileWorker::doRead() } mReadData = (U8*)ll_aligned_malloc_16(mDataSize); - S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool()); - + S32 bytes_read = (S32)LLFile::read(mFileName, mReadData, mOffset, mDataSize); if (bytes_read != mDataSize) { // LL_WARNS() << "Error reading file from local cache: " << mFileName @@ -235,7 +239,7 @@ bool LLTextureCacheLocalFileWorker::doWrite() return false; } -class LLTextureCacheRemoteWorker : public LLTextureCacheWorker +class LLTextureCacheRemoteWorker final : public LLTextureCacheWorker { public: LLTextureCacheRemoteWorker(LLTextureCache* cache, const LLUUID& id, @@ -296,7 +300,7 @@ bool LLTextureCacheRemoteWorker::doRead() // Is it a JPEG2000 file? { local_filename = filename + ".j2c"; - local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { mImageFormat = IMG_CODEC_J2C; @@ -306,7 +310,7 @@ bool LLTextureCacheRemoteWorker::doRead() if (local_size == 0) { local_filename = filename + ".jpg"; - local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { mImageFormat = IMG_CODEC_JPEG; @@ -317,7 +321,7 @@ bool LLTextureCacheRemoteWorker::doRead() if (local_size == 0) { local_filename = filename + ".tga"; - local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { mImageFormat = IMG_CODEC_TGA; @@ -337,7 +341,7 @@ bool LLTextureCacheRemoteWorker::doRead() if (!done && (mState == LOCAL)) { llassert(local_size != 0); // we're assuming there is a non empty local file here... - if (!mDataSize || mDataSize > local_size) + if (mDataSize <= 0 || mDataSize > local_size) { mDataSize = local_size; } @@ -346,12 +350,10 @@ bool LLTextureCacheRemoteWorker::doRead() if (mReadData) { - S32 bytes_read = LLAPRFile::readEx( local_filename, - mReadData, - mOffset, - mDataSize, - mCache->getLocalAPRFilePool()); - + S32 bytes_read = (S32)LLFile::read(local_filename, + mReadData, + mOffset, + mDataSize); if (bytes_read != mDataSize) { LL_WARNS() << "Error reading file from local cache: " << local_filename @@ -410,8 +412,7 @@ bool LLTextureCacheRemoteWorker::doRead() mReadData = (U8*)ll_aligned_malloc_16(size); if (mReadData) { - S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName, - mReadData, offset, size, mCache->getLocalAPRFilePool()); + S32 bytes_read = (S32)LLFile::read(mCache->mHeaderDataFilePath, mReadData, offset, size); if (bytes_read != size) { LL_WARNS() << "LLTextureCacheWorker: " << mID @@ -445,10 +446,10 @@ bool LLTextureCacheRemoteWorker::doRead() // Fourth state / stage : read the rest of the data from the UUID based cached file if (!done && (mState == BODY)) { - std::string filename = mCache->getTextureFileName(mID); - S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool()); + std::filesystem::path file_path = fsyspath(mCache->getTextureFileName(mID)); + S32 filesize = (S32)LLFile::size(file_path); - if (filesize && (filesize + TEXTURE_CACHE_ENTRY_SIZE) > mOffset) + if (filesize > 0 && (filesize + TEXTURE_CACHE_ENTRY_SIZE) > mOffset) { S32 max_datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize - mOffset; mDataSize = llmin(max_datasize, mDataSize); @@ -487,10 +488,9 @@ bool LLTextureCacheRemoteWorker::doRead() mReadData = data; // Read the data at last - S32 bytes_read = LLAPRFile::readEx(filename, - mReadData + data_offset, - file_offset, file_size, - mCache->getLocalAPRFilePool()); + S32 bytes_read = (S32)LLFile::read(file_path, + mReadData + data_offset, + file_offset, file_size); if (bytes_read != file_size) { LL_WARNS() << "LLTextureCacheWorker: " << mID @@ -516,7 +516,7 @@ bool LLTextureCacheRemoteWorker::doRead() { // No body, we're done. mDataSize = llmax(TEXTURE_CACHE_ENTRY_SIZE - mOffset, 0); - LL_DEBUGS() << "No body file for: " << filename << LL_ENDL; + LL_DEBUGS() << "No body file for: " << file_path << LL_ENDL; } // Nothing else to do at that point... done = true; @@ -636,13 +636,13 @@ bool LLTextureCacheRemoteWorker::doWrite() U8* padBuffer = (U8*)ll_aligned_malloc_16(TEXTURE_CACHE_ENTRY_SIZE); memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer - bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool()); + bytes_written = (S32)LLFile::write(mCache->mHeaderDataFilePath, padBuffer, offset, size); ll_aligned_free_16(padBuffer); } else { // Write the header record (== first TEXTURE_CACHE_ENTRY_SIZE bytes of the raw file) in the header file - bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool()); + bytes_written = (S32)LLFile::write(mCache->mHeaderDataFilePath, mWriteData, offset, size); } if (bytes_written <= 0) @@ -678,15 +678,11 @@ bool LLTextureCacheRemoteWorker::doWrite() else { S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE; - { // build the cache file name from the UUID std::string filename = mCache->getTextureFileName(mID); // LL_INFOS() << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << LL_ENDL; - S32 bytes_written = LLAPRFile::writeEx(filename, - mWriteData + TEXTURE_CACHE_ENTRY_SIZE, - 0, file_size, - mCache->getLocalAPRFilePool()); + S32 bytes_written = (S32)LLFile::write(filename, mWriteData + TEXTURE_CACHE_ENTRY_SIZE, 0, file_size); if (bytes_written <= 0) { LL_WARNS() << "LLTextureCacheWorker: " << mID @@ -866,9 +862,9 @@ std::string LLTextureCache::getLocalFileName(const LLUUID& id) std::string LLTextureCache::getTextureFileName(const LLUUID& id) { - std::string idstr = id.asString(); - std::string delem = gDirUtilp->getDirDelimiter(); - std::string filename = mTexturesDirName + delem + idstr[0] + delem + idstr + ".texture"; + char idstr[UUID_STR_LENGTH]{}; + id.to_chars(idstr); + std::string filename = llformat("%s%s%c%s%s.texture", mTexturesDirName.c_str(), gDirUtilp->getDirDelimiter().c_str(), idstr[0], gDirUtilp->getDirDelimiter().c_str(), idstr); return filename; } @@ -891,7 +887,7 @@ bool LLTextureCache::isInLocal(const LLUUID& id) // Is it a JPEG2000 file? { local_filename = filename + ".j2c"; - local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { return true ; @@ -901,7 +897,7 @@ bool LLTextureCache::isInLocal(const LLUUID& id) // If not, is it a jpeg file? { local_filename = filename + ".jpg"; - local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { return true ; @@ -911,7 +907,7 @@ bool LLTextureCache::isInLocal(const LLUUID& id) // Hmm... What about a targa file? (used for UI texture mostly) { local_filename = filename + ".tga"; - local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + local_size = (S32)LLFile::size(local_filename); if (local_size > 0) { return true ; @@ -943,10 +939,10 @@ const char* fast_cache_filename = "FastCache.cache"; void LLTextureCache::setDirNames(ELLPath location) { - std::string delem = gDirUtilp->getDirDelimiter(); - mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, entries_filename); - mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename); + mHeaderDataFilePath = fsyspath(gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename)); + mHeaderEntriesFilePath = fsyspath(mHeaderEntriesFileName); + mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname); mFastCacheFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, fast_cache_filename); } @@ -966,11 +962,10 @@ void LLTextureCache::purgeCache(ELLPath location, bool remove_dir) if(LLFile::isdir(mTexturesDirName)) { std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename); - // mHeaderAPRFilePoolp because we are under header mutex, and can be in main thread - LLAPRFile::remove(file_name, mHeaderAPRFilePoolp); + LLFile::remove(file_name); file_name = gDirUtilp->getExpandedFilename(location, cache_filename); - LLAPRFile::remove(file_name, mHeaderAPRFilePoolp); + LLFile::remove(file_name); purgeAllTextures(true); } @@ -1073,10 +1068,9 @@ void LLTextureCache::readEntriesHeader() { // mHeaderEntriesInfo initializes to default values so safe not to read it llassert_always(mHeaderAPRFile == NULL); - if (LLAPRFile::isExist(mHeaderEntriesFileName, mHeaderAPRFilePoolp)) + if (LLFile::isfile(mHeaderEntriesFilePath)) { - LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), - mHeaderAPRFilePoolp); + LLFile::read(mHeaderEntriesFilePath, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo)); } else //create an empty entries header. { @@ -1092,7 +1086,7 @@ void LLTextureCache::setEntriesHeader() // For simplicity we use predefined size of header, so if version string // doesn't fit, either getEngineInfo() returned malformed string or // sHeaderEncoderStringSize need to be increased. - // Also take into accout that c_str() returns additional null character + // Also take into account that c_str() returns additional null character LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL; } @@ -1107,8 +1101,7 @@ void LLTextureCache::writeEntriesHeader() llassert_always(mHeaderAPRFile == NULL); if (!mReadOnly) { - LLAPRFile::writeEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), - mHeaderAPRFilePoolp); + LLFile::write(mHeaderEntriesFilePath, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo)); } } @@ -1224,8 +1217,7 @@ void LLTextureCache::writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool idx = -1 ;//mark the idx invalid. return ; } - - mHeaderAPRFile->seek(APR_SET, offset); + aprfile->seek(APR_SET, offset); } else { @@ -1362,21 +1354,26 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) } aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo)); } - for (U32 idx=0; idx<num_entries; idx++) + + U32 idx = 0; + try { - try + entries.resize(num_entries); + S32 total_entries_size = sizeof(Entry) * num_entries; + S32 bytes_read = aprfile->read((void*)entries.data(), total_entries_size); + if (bytes_read != total_entries_size) { - 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) + LL_WARNS() << "Corrupted header entries, expected " << total_entries_size << " bytes but got " << bytes_read << " bytes" << LL_ENDL; + closeHeaderEntriesFile(); + purgeAllTextures(false); + return 0; + } + + for (; idx < num_entries; idx++) + { + const Entry& entry = entries[idx]; +// 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; @@ -1387,17 +1384,17 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) mFreeList.insert(idx); } } - catch (std::bad_alloc&) - { - // 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; - } + } + catch (const std::bad_alloc&) + { + // 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; } closeHeaderEntriesFile(); return num_entries; @@ -1632,7 +1629,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) gDirUtilp->deleteFilesInDir(mTexturesDirName, mask); // headers, fast cache if (purge_directories) { - LLFile::rmdir(mTexturesDirName); + LLFile::remove(mTexturesDirName); } } { @@ -1822,8 +1819,7 @@ void LLTextureCache::purgeTextures(bool validate) { std::string filename = getTextureFileName(entries[idx].mID); LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mBodySize << LL_ENDL; - // mHeaderAPRFilePoolp because this is under header mutex in main thread - S32 bodysize = LLAPRFile::size(filename, mHeaderAPRFilePoolp); + S32 bodysize = (S32)LLFile::size(filename); if (bodysize != entries[idx].mBodySize) { LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mBodySize << filename << LL_ENDL; @@ -2177,7 +2173,7 @@ void LLTextureCache::openFastCache(bool first_time) mFastCachePadBuffer = (U8*)ll_aligned_malloc_16(TEXTURE_FAST_CACHE_ENTRY_SIZE); } mFastCachePoolp = new LLVolatileAPRPool(); // is_local= true by default, so not thread safe by default - if (LLAPRFile::isExist(mFastCacheFileName, mFastCachePoolp)) + if (LLFile::isfile(mFastCacheFileName)) { mFastCachep = new LLAPRFile(mFastCacheFileName, APR_READ|APR_WRITE|APR_BINARY, mFastCachePoolp) ; } @@ -2263,9 +2259,7 @@ void LLTextureCache::removeCachedTexture(const LLUUID& id) LLMutexLock lock(&mHeaderIDMapMutex); mHeaderIDMap.erase(id); } - // We are inside header's mutex so mHeaderAPRFilePoolp is safe to use, - // but getLocalAPRFilePool() is not safe, it might be in use by worker - LLAPRFile::remove(getTextureFileName(id), mHeaderAPRFilePoolp); + LLFile::remove(getTextureFileName(id)); } //called after mHeaderMutex is locked. @@ -2278,9 +2272,7 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename) if (entry.mBodySize == 0) // Always attempt to remove when mBodySize > 0. { // Sanity check. Shouldn't exist when body size is 0. - // We are inside header's mutex so mHeaderAPRFilePoolp is safe to use, - // but getLocalAPRFilePool() is not safe, it might be in use by worker - if (LLAPRFile::isExist(filename, mHeaderAPRFilePoolp)) + if (LLFile::isfile(filename)) { LL_WARNS("TextureCache") << "Entry has body size of zero but file " << filename << " exists. Deleting this file, too." << LL_ENDL; } @@ -2303,7 +2295,7 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename) if (file_maybe_exists) { - LLAPRFile::remove(filename, mHeaderAPRFilePoolp); + LLFile::remove(filename); } } diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index a09bcc1572..100527fbfc 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -219,7 +219,8 @@ private: // HEADERS (Include first mip) std::string mHeaderEntriesFileName; - std::string mHeaderDataFileName; + std::filesystem::path mHeaderEntriesFilePath; + std::filesystem::path mHeaderDataFilePath; std::string mFastCacheFileName; EntriesInfo mHeaderEntriesInfo; std::set<S32> mFreeList; // deleted entries diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 51ade60827..a0d7aac3f3 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1297,7 +1297,7 @@ bool LLTextureFetchWorker::doWork(S32 param) else { mCanUseCapability = false; - if (gDisconnected) + if (gDisconnected || LLAppViewer::isExiting()) { // We lost connection or are shutting down. mCanUseHTTP = false; @@ -1315,6 +1315,12 @@ bool LLTextureFetchWorker::doWork(S32 param) else { mCanUseCapability = false; + if (gDisconnected || LLAppViewer::isExiting()) + { + // We lost connection or are shutting down. + mCanUseHTTP = false; + return true; // abort + } mRegionRetryAttempt++; mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY); // This will happen if not logged in or if a region deoes not have HTTP Texture enabled @@ -2521,18 +2527,26 @@ 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); + + // Potentially we might remove a request, lock queue here instead + // of getWorker to make sure request will persist till removeRequest + lockQueue(); + LLTextureFetchWorker* worker = getWorkerAfterLock(id); if (worker) { if (worker->mHost != host) { LL_WARNS(LOG_TXT) << "LLTextureFetch::createRequest " << id << " called with multiple hosts: " << host << " != " << worker->mHost << LL_ENDL; - removeRequest(worker, true); + size_t erased_1 = mRequestMap.erase(worker->mID); + llassert_always(erased_1 > 0); + unlockQueue(); + worker->scheduleDelete(); worker = NULL; return CREATE_REQUEST_ERROR_MHOSTS; } } + unlockQueue(); S32 desired_size; std::string exten = gDirUtilp->getExtension(url); @@ -2711,9 +2725,11 @@ void LLTextureFetch::deleteAllRequests() } LLTextureFetchWorker* worker = mRequestMap.begin()->second; - unlockQueue() ; + size_t erased_1 = mRequestMap.erase(worker->mID); + llassert_always(erased_1 > 0); + unlockQueue(); - removeRequest(worker, true); + worker->scheduleDelete(); } } diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index c1ec5fa183..c401a00fd7 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -420,7 +420,7 @@ void LLToolBarView::saveToolbars() const if(!output_node->isNull()) { const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml"); - LLFILE *fp = LLFile::fopen(filename, "w"); + LLFILE *fp = LLFile::fopen(filename, LLFILE_MODE("w")); if (fp != NULL) { LLXMLNode::writeHeaderToFile(fp); diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index cf7b123fa7..d31dc078e5 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -685,7 +685,10 @@ bool LLToolBrushLand::canTerraformParcel(LLViewerRegion* regionp) const if (selected_parcel) { bool owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(selected_parcel, GP_LAND_ALLOW_EDIT_LAND); - is_terraform_allowed = ( gAgent.canManageEstate() || (selected_parcel->getOwnerID() == regionp->getOwner()) || owner_release); + is_terraform_allowed = ( regionp->canManageEstate() + || (selected_parcel->getOwnerID() == regionp->getOwner()) + || owner_release + || selected_parcel->getAllowTerraform()); } return is_terraform_allowed; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 5e2d91d31e..33fd9f2dd9 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1828,7 +1828,7 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj, } } } - hit_obj->saveScript(new_script, active, true); + hit_obj->saveScript(new_script, active, true, LLUUID::null); if (gFloaterTools) { gFloaterTools->dirty(); @@ -2578,7 +2578,12 @@ bool is_water_exclusion_face(LLViewerObject* obj, S32 face) bool exclude_water = (image->getID() == IMG_ALPHA_GRAD) && obj->isImageAlphaBlended(face); // transparency - exclude_water &= (obj->getTE(face)->getColor().mV[VALPHA] == 1); + // getTE gets from a different source than getTEImage, so check for null + LLTextureEntry* te = obj->getTE(face); + if (te) + { + exclude_water &= (te->getColor().mV[VALPHA] == 1); + } //absence of normal and specular textures image = obj->getTENormalMap(face); diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 8ce9a8b632..11dd26309e 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -93,6 +93,20 @@ LLVisualParamHint::LLVisualParamHint( { LLVisualParamHint::sInstances.insert( this ); mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.png"); + if (mBackgroundp) + { + LLViewerFetchedTexture* tex = dynamic_cast<LLViewerFetchedTexture*>(mBackgroundp->getImage().get()); + if (tex) + { + tex->setKnownDrawSize(width, height); + } + + mBackgroundLoadedConnection = mBackgroundp->addLoadedCallback([this]() + { + mNeedsUpdate = true; + mDelayFrames = 0; + }); + } llassert(width != 0); llassert(height != 0); @@ -104,6 +118,7 @@ LLVisualParamHint::LLVisualParamHint( LLVisualParamHint::~LLVisualParamHint() { LLVisualParamHint::sInstances.erase( this ); + mBackgroundLoadedConnection.disconnect(); } //virtual @@ -143,12 +158,21 @@ void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVis bool LLVisualParamHint::needsRender() { + // needsRender gets called once per frame from + // LLViewerDynamicTexture::updateAllInstances() return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgentAvatarp->getIsAppearanceAnimating() && mAllowsUpdates; } void LLVisualParamHint::preRender(bool clear_depth) { - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LL_DEBUGS("ParamHint") << "preRender: param=" << mVisualParam->getName() + << " id=" << mVisualParam->getID() + << " weight=" << mVisualParamWeight + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " pixelArea=" << gAgentAvatarp->mAdjustedPixelArea + << " appearanceAnimating=" << gAgentAvatarp->getIsAppearanceAnimating() + << LL_ENDL; + LLViewerWearable* wearable = dynamic_cast<LLViewerWearable*>(mWearablePtr); if (wearable) { wearable->setVolatile(true); @@ -167,6 +191,22 @@ void LLVisualParamHint::preRender(bool clear_depth) { gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable); gAgentAvatarp->updateLOD(); + + if (gAgentAvatarp->mDrawable->isState(LLDrawable::REBUILD_GEOMETRY) + || gAgentAvatarp->mDirtyMesh > 0) + { + // updateLOD marks meshes for an update. + LL_DEBUGS("ParamHint") << "preRender: updateMeshData" + << " param=" << mVisualParam->getName() + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " rebuildGeom=" << gAgentAvatarp->mDrawable->isState(LLDrawable::REBUILD_GEOMETRY) + << LL_ENDL; + // Clear states and force update so that renderSkinned inside generateImpostor + // does not re-run updateMeshData() with a partially consistent mesh state, + // which would reassign mFace pointers on some meshes while others are + // mid-draw with stale vertex offsets. + gAgentAvatarp->updateMeshData(); + } } else { @@ -246,8 +286,15 @@ bool LLVisualParamHint::render() LLViewerCamera::getInstance()->setPerspective(false, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, false); - if (gAgentAvatarp->mDrawable.notNull()) + llassert(!LLPipeline::sImpostorRender); // We are rendering this from UI, shouldn't be set + if (gAgentAvatarp->mDrawable.notNull() && !LLPipeline::sImpostorRender) { + LL_DEBUGS("ParamHint") << "render: generating impostor" + << " param=" << mVisualParam->getName() + << " drawableState=0x" << std::hex << gAgentAvatarp->mDrawable->getState() << std::dec + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " mMeshValid=" << gAgentAvatarp->mMeshValid + << LL_ENDL; LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); gGL.flush(); gGL.setSceneBlendType(LLRender::BT_REPLACE); @@ -258,7 +305,7 @@ bool LLVisualParamHint::render() gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LLViewerWearable* wearable = dynamic_cast<LLViewerWearable*>(mWearablePtr); if (wearable) { wearable->setVolatile(false); diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index fb62ba9bba..9f4b5f6fe9 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -95,6 +95,7 @@ protected: LLJoint* mCamTargetJoint; // joint to target with preview camera LLUIImagePtr mBackgroundp; + boost::signals2::scoped_connection mBackgroundLoadedConnection; typedef std::set< LLVisualParamHint* > instance_list_t; static instance_list_t sInstances; diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp deleted file mode 100644 index 179aae1e02..0000000000 --- a/indra/newview/lltoolview.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @file lltoolview.cpp - * @brief A UI contains for tool palette tools - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lltoolview.h" - -#include "llfontgl.h" -#include "llrect.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llpanel.h" -#include "lltool.h" -#include "lltoolmgr.h" -#include "lltextbox.h" -#include "llresmgr.h" - - -LLToolContainer::LLToolContainer(LLToolView* parent) -: mParent(parent), - mButton(NULL), - mPanel(NULL), - mTool(NULL) -{ } - - -LLToolContainer::~LLToolContainer() -{ - // mParent is a pointer to the tool view - // mButton is owned by the tool view - // mPanel is owned by the tool view - delete mTool; - mTool = NULL; -} - - -LLToolView::LLToolView(const std::string& name, const LLRect& rect) -: mButtonCount(0) -{ - LLView::init(LLView::Params().name(name).rect(rect).mouse_opaque(true)); -} - - -LLToolView::~LLToolView() -{ - for_each(mContainList.begin(), mContainList.end(), DeletePointer()); - mContainList.clear(); -} - -//*TODO:translate? -// void LLToolView::addTool(const std::string& icon_off, const std::string& icon_on, LLPanel* panel, LLTool* tool, LLView* hoverView, const char* label) -// { -// llassert(tool); - -// LLToolContainer* contain = new LLToolContainer(this); - -// LLRect btn_rect = getButtonRect(mButtonCount); - -// contain->mButton = new LLButton("ToolBtn", -// btn_rect, -// icon_off, -// icon_on, -// "", -// &LLToolView::onClickToolButton, -// contain, -// LLFontGL::getFontSansSerif()); - -// contain->mPanel = panel; -// contain->mTool = tool; - -// addChild(contain->mButton); -// mButtonCount++; - -// const S32 LABEL_TOP_SPACING = 0; -// const LLFontGL* font = LLResMgr::getInstance()->getRes( LLFONT_SANSSERIF_SMALL ); -// S32 label_width = font->getWidth( label ); -// LLRect label_rect; -// label_rect.setLeftTopAndSize( -// btn_rect.mLeft + btn_rect.getWidth() / 2 - label_width / 2, -// btn_rect.mBottom - LABEL_TOP_SPACING, -// label_width, -// llfloor(font->getLineHeight())); -// addChild( new LLTextBox( "tool label", label_rect, label, font ) ); - -// // Can optionally ignore panel -// if (contain->mPanel) -// { -// contain->mPanel->setBackgroundVisible( FALSE ); -// contain->mPanel->setBorderVisible( FALSE ); -// addChild(contain->mPanel); -// } - -// mContainList.push_back(contain); -// } - - -LLRect LLToolView::getButtonRect(S32 button_index) -{ - const S32 HPAD = 7; - const S32 VPAD = 7; - const S32 TOOL_SIZE = 32; - const S32 HORIZ_SPACING = TOOL_SIZE + 5; - const S32 VERT_SPACING = TOOL_SIZE + 14; - - S32 tools_per_row = getRect().getWidth() / HORIZ_SPACING; - - S32 row = button_index / tools_per_row; - S32 column = button_index % tools_per_row; - - // Build the rectangle, recalling the origin is at lower left - // and we want the icons to build down from the top. - LLRect rect; - rect.setLeftTopAndSize( HPAD + (column * HORIZ_SPACING), - -VPAD + getRect().getHeight() - (row * VERT_SPACING), - TOOL_SIZE, - TOOL_SIZE - ); - - return rect; -} - - -void LLToolView::draw() -{ - // turn off highlighting for all containers - // and hide all option panels except for the selected one. - LLTool* selected = LLToolMgr::getInstance()->getCurrentToolset()->getSelectedTool(); - for (contain_list_t::iterator iter = mContainList.begin(); - iter != mContainList.end(); ++iter) - { - LLToolContainer* contain = *iter; - BOOL state = (contain->mTool == selected); - contain->mButton->setToggleState( state ); - if (contain->mPanel) - { - contain->mPanel->setVisible( state ); - } - } - - // Draw children normally - LLView::draw(); -} - -// protected -LLToolContainer* LLToolView::findToolContainer( LLTool *tool ) -{ - // Find the container for this tool - llassert( tool ); - for (contain_list_t::iterator iter = mContainList.begin(); - iter != mContainList.end(); ++iter) - { - LLToolContainer* contain = *iter; - if( contain->mTool == tool ) - { - return contain; - } - } - LL_ERRS() << "LLToolView::findToolContainer - tool not found" << LL_ENDL; - return NULL; -} - -// static -void LLToolView::onClickToolButton(void* userdata) -{ - LLToolContainer* clicked = (LLToolContainer*) userdata; - - // Switch to this one - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( clicked->mTool ); -} - - - diff --git a/indra/newview/lltoolview.h b/indra/newview/lltoolview.h deleted file mode 100644 index 7b348e7088..0000000000 --- a/indra/newview/lltoolview.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lltoolview.h - * @brief UI container for tools. - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLTOOLVIEW_H -#define LL_LLTOOLVIEW_H - -// requires stdtypes.h -#include "llpanel.h" - -// forward declares -class LLTool; -class LLButton; - -class LLToolView; - - -// Utility class, container for the package of information we need about -// each tool. The package can either point directly to a tool, or indirectly -// to another view of tools. -class LLToolContainer -{ -public: - LLToolContainer(LLToolView* parent); - ~LLToolContainer(); - -public: - LLToolView* mParent; // toolview that owns this container - LLButton* mButton; - LLPanel* mPanel; - LLTool* mTool; // if not NULL, this is a tool ref -}; - - -// A view containing automatically arranged button icons representing -// tools. The icons sit on top of panels containing options for each -// tool. -class LLToolView -: public LLView -{ -public: - LLToolView(const std::string& name, const LLRect& rect); - ~LLToolView(); - - virtual void draw(); // handle juggling tool button highlights, panel visibility - - static void onClickToolButton(void* container); - - LLView* getCurrentHoverView(); - -private: - LLRect getButtonRect(S32 button_index); // return rect for button to add, zero-based index - LLToolContainer *findToolContainer(LLTool *tool); - - -private: - typedef std::vector<LLToolContainer*> contain_list_t; - contain_list_t mContainList; - S32 mButtonCount; // used to compute rectangles -}; - -#endif diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index dcd1582eb9..2d5baae52e 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -155,7 +155,7 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, LLSD { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getMerchantStatusCoro", httpPolicy); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("verifyKeyCoro", 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>(); @@ -807,13 +807,7 @@ LLSD LLAzureTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCorout LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray); LLCore::BufferArrayStream outs(rawbody.get()); - static const std::string allowed_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz " - "0123456789" - "-._~"; - - outs << "[{\"text\":\""; - outs << LLURI::escape(msg, allowed_chars); - outs << "\"}]"; + outs << boost::json::serialize(boost::json::array{ boost::json::object{{ "text", msg }} }); return adapter->postRawAndSuspend(request, url, rawbody, options, headers); } diff --git a/indra/newview/llurlfloaterdispatchhandler.cpp b/indra/newview/llurlfloaterdispatchhandler.cpp index 9bee4870be..cf0657ea2f 100644 --- a/indra/newview/llurlfloaterdispatchhandler.cpp +++ b/indra/newview/llurlfloaterdispatchhandler.cpp @@ -29,15 +29,9 @@ #include "llurlfloaterdispatchhandler.h" #include "llfloaterreg.h" -#include "llfloaterhowto.h" #include "llfloaterwebcontent.h" #include "llsdserialize.h" -#include "llviewercontrol.h" #include "llviewergenericmessage.h" -#include "llweb.h" - -// Example: -// llOpenFloater("guidebook", "http://page.com", []); // values specified by server side's dispatcher // for llopenfloater @@ -50,20 +44,12 @@ const std::string KEY_URL("floater_url"); const std::string KEY_PARAMS("floater_params"); // Supported floaters -const std::string FLOATER_GUIDEBOOK("guidebook"); -const std::string FLOATER_HOW_TO("how_to"); // alias for guidebook const std::string FLOATER_WEB_CONTENT("web_content"); // All arguments are palceholders! Server side will need to add validation first. // Web content universal argument const std::string KEY_TRUSTED_CONTENT("trusted_content"); -// Guidebook specific arguments -const std::string KEY_WIDTH("width"); -const std::string KEY_HEGHT("height"); -const std::string KEY_CAN_CLOSE("can_close"); -const std::string KEY_TITLE("title"); - // web_content specific arguments const std::string KEY_SHOW_PAGE_TITLE("show_page_title"); const std::string KEY_ALLOW_ADRESS_ENTRY("allow_address_entry"); // It is not recomended to set this to true if trusted content is allowed @@ -143,48 +129,7 @@ bool LLUrlFloaterDispatchHandler::operator()(const LLDispatcher *, const std::st LLFloaterWebContent::Params params; params.url = url; - if (floater == FLOATER_GUIDEBOOK || floater == FLOATER_HOW_TO) - { - LL_DEBUGS("URLFloater") << "Opening how_to floater with parameters: " << message << LL_ENDL; - if (command_params.isMap()) // by default is undefines - { - params.trusted_content = command_params.has(KEY_TRUSTED_CONTENT) ? command_params[KEY_TRUSTED_CONTENT].asBoolean() : false; - - // Script's side argument list can't include other lists, neither - // there is a LLRect type, so expect just width and height - if (command_params.has(KEY_WIDTH) && command_params.has(KEY_HEGHT)) - { - LLRect rect(0, command_params[KEY_HEGHT].asInteger(), command_params[KEY_WIDTH].asInteger(), 0); - params.preferred_media_size.setValue(rect); - } - } - - // Some locations will have customized guidebook, which this function easists for - // only one instance of guidebook can exist at a time, so if this command arrives, - // we need to close previous guidebook then reopen it. - - LLFloater* instance = LLFloaterReg::findInstance("guidebook"); - if (instance) - { - instance->closeHostedFloater(); - } - - LLFloaterReg::toggleInstanceOrBringToFront("guidebook", params); - - if (command_params.isMap()) - { - LLFloater* instance = LLFloaterReg::findInstance("guidebook"); - if (command_params.has(KEY_CAN_CLOSE)) - { - instance->setCanClose(command_params[KEY_CAN_CLOSE].asBoolean()); - } - if (command_params.has(KEY_TITLE)) - { - instance->setTitle(command_params[KEY_TITLE].asString()); - } - } - } - else if (floater == FLOATER_WEB_CONTENT) + if (floater == FLOATER_WEB_CONTENT) { LL_DEBUGS("URLFloater") << "Opening web_content floater with parameters: " << message << LL_ENDL; if (command_params.isMap()) // by default is undefines, might be better idea to init params from command_params diff --git a/indra/newview/llvelopack.cpp b/indra/newview/llvelopack.cpp index 90eb977bba..927a5bbc2c 100644 --- a/indra/newview/llvelopack.cpp +++ b/indra/newview/llvelopack.cpp @@ -31,6 +31,7 @@ #include "llstring.h" #include "llcorehttputil.h" #include "llversioninfo.h" +#include "llversioninfovars.h" // LL_VIEWER_CHANNEL #include <boost/json.hpp> #include <fstream> @@ -43,15 +44,19 @@ #include "Velopack.h" #if LL_WINDOWS +#include "llappviewerwin32.h" #include <windows.h> #include <shlobj.h> #include <shobjidl.h> #include <shlwapi.h> #include <objbase.h> #include <filesystem> +#include <propkey.h> +#include <propvarutil.h> #pragma comment(lib, "shlwapi.lib") #pragma comment(lib, "ole32.lib") +#pragma comment(lib, "propsys.lib") #pragma comment(lib, "shell32.lib") #endif // LL_WINDOWS @@ -238,7 +243,7 @@ static bool custom_download_asset(void* user_data, { // The asset has already been downloaded at the coroutine level (before vpkc_download_updates). // This callback just copies the pre-downloaded file to where Velopack expects it. - // We cannot use getRawAndSuspend here — coroutine context is lost through the Rust FFI boundary. + // We cannot use getRawAndSuspend here - coroutine context is lost through the Rust FFI boundary. if (sPreDownloadedAssetPath.empty()) { LL_WARNS("Velopack") << "No pre-downloaded asset available" << LL_ENDL; @@ -330,6 +335,17 @@ static std::wstring get_desktop_path() return L""; } +static std::wstring get_app_user_model_id() +{ + // Format: CompanyName.ProductName + // This ID is used for: + // 1. Registry registration (HKCU\Software\Classes\Applications\{exe}\AppUserModelID) + // 2. Shortcut property (IPropertyStore::SetValue with PKEY_AppUserModel_ID) + // 3. Runtime process ID (SetCurrentProcessExplicitAppUserModelID if needed) + // Must be consistent across all uses for proper taskbar grouping. + return L"LindenLab." + get_app_name_oneword(); +} + static HRESULT create_shortcut(const std::wstring& shortcut_path, const std::wstring& target_path, const std::wstring& arguments, @@ -354,6 +370,28 @@ static HRESULT create_shortcut(const std::wstring& shortcut_path, PathRemoveFileSpecW(work_dir); shell_link->SetWorkingDirectory(work_dir); + // Set AppUserModelID on the shortcut + IPropertyStore* prop_store = nullptr; + hr = shell_link->QueryInterface(IID_IPropertyStore, (void**)&prop_store); + if (SUCCEEDED(hr)) + { + PROPVARIANT pv; + PropVariantInit(&pv); + std::wstring app_id = get_app_user_model_id(); + hr = InitPropVariantFromString(app_id.c_str(), &pv); + if (SUCCEEDED(hr)) + { + hr = prop_store->SetValue(PKEY_AppUserModel_ID, pv); + PropVariantClear(&pv); + if (SUCCEEDED(hr)) + { + HRESULT hr_commit = prop_store->Commit(); + if (FAILED(hr_commit)) hr = hr_commit; + } + } + prop_store->Release(); + } + IPersistFile* persist_file = nullptr; hr = shell_link->QueryInterface(IID_IPersistFile, (void**)&persist_file); if (SUCCEEDED(hr)) @@ -405,6 +443,42 @@ static void register_protocol_handler(const std::wstring& protocol, } } +static void register_app_user_model_id(const std::wstring& exe_name) +{ + // Register AppUserModelID for the executable + // This allows Windows to properly group taskbar items when users drag-and-drop + // the exe to pin it, without requiring runtime calls to SetCurrentProcessExplicitAppUserModelID + std::wstring key_path = L"SOFTWARE\\Classes\\Applications\\" + exe_name; + HKEY hkey; + + if (RegCreateKeyExW(HKEY_CURRENT_USER, key_path.c_str(), 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, NULL) == ERROR_SUCCESS) + { + std::wstring app_user_model_id = get_app_user_model_id(); + LSTATUS status = RegSetValueExW(hkey, L"AppUserModelID", 0, REG_SZ, + (BYTE*)app_user_model_id.c_str(), + (DWORD)((app_user_model_id.size() + 1) * sizeof(wchar_t))); + RegCloseKey(hkey); + + if (status == ERROR_SUCCESS) + { + LL_DEBUGS("Velopack") << "Registered AppUserModelID: " + << ll_convert_wide_to_string(app_user_model_id) + << " for " << ll_convert_wide_to_string(exe_name) << LL_ENDL; + } + else + { + LL_WARNS("Velopack") << "Failed to set AppUserModelID (error " << status << ") for " + << ll_convert_wide_to_string(exe_name) << LL_ENDL; + } + } + else + { + LL_WARNS("Velopack") << "Failed to register AppUserModelID for " + << ll_convert_wide_to_string(exe_name) << LL_ENDL; + } +} + static bool get_shortcut_target(const std::wstring& lnk_path, std::wstring& target_path_str) { // Resolve the shortcut to check its target @@ -717,6 +791,12 @@ static void unregister_protocol_handler(const std::wstring& protocol) RegDeleteTreeW(HKEY_CURRENT_USER, key_path.c_str()); } +static void unregister_app_user_model_id(const std::wstring& exe_name) +{ + std::wstring key_path = L"SOFTWARE\\Classes\\Applications\\" + exe_name; + RegDeleteTreeW(HKEY_CURRENT_USER, key_path.c_str()); +} + static void register_uninstall_info(const std::wstring& install_dir, const std::wstring& app_name, const std::wstring& version) @@ -793,7 +873,9 @@ static void unregister_uninstall_info() RegDeleteTreeW(HKEY_CURRENT_USER, key_path.c_str()); } -static void create_shortcuts(const std::wstring& install_dir, const std::wstring& app_name) +static void create_shortcuts( + const std::wstring& install_dir, + const std::wstring& app_name) { std::wstring exe_path = install_dir + L"\\" + get_viewer_exe_name(); std::wstring start_menu_dir = get_start_menu_path() + L"\\" + app_name; @@ -865,21 +947,32 @@ static void on_after_install(void* user_data, const char* app_version) { std::wstring install_dir = get_install_dir(); std::wstring app_name = get_app_name(); - std::wstring exe_path = install_dir + L"\\" + get_viewer_exe_name(); + std::wstring exe_name = get_viewer_exe_name(); + std::wstring exe_path = install_dir + L"\\" + exe_name; register_protocol_handler(PROTOCOL_SECONDLIFE, L"URL:Second Life", exe_path); register_protocol_handler(PROTOCOL_GRID_INFO, L"URL:Second Life", exe_path); + + // Register AppUserModelID for taskbar pinning support + register_app_user_model_id(exe_name); + create_shortcuts(install_dir, app_name); } static void on_before_uninstall(void* user_data, const char* app_version) { std::wstring app_name = get_app_name(); + std::wstring exe_name = get_viewer_exe_name(); unregister_protocol_handler(PROTOCOL_SECONDLIFE); unregister_protocol_handler(PROTOCOL_GRID_INFO); - unregister_uninstall_info(); + unregister_app_user_model_id(exe_name); remove_shortcuts(app_name); + + std::wstring install_dir = get_install_dir(); + LLAppViewerWin32::sendShutdownToOtherInstances(install_dir); + + unregister_uninstall_info(); } static void on_log_message(void* user_data, const char* level, const char* message) @@ -998,7 +1091,7 @@ static void ensure_update_manager(bool allow_downgrade) LL_INFOS("Velopack") << "Auto-detect failed (" << ll_safe_string(err) << "), falling back to explicit locator" << LL_ENDL; - // Auto-detection failed — construct an explicit locator. + // Auto-detection failed - construct an explicit locator. // This handles legacy DMG installs that don't have Velopack's // install state (UpdateMac, sq.version) in the bundle. vpkc_locator_config_t locator = {}; @@ -1166,7 +1259,7 @@ static void on_downloading_closed(const LLSD& notification, const LLSD& response sDownloadingNotification = nullptr; if (sIsRequired) { - // User closed the downloading dialog during a required update — re-show it + // User closed the downloading dialog during a required update - re-show it show_downloading_notification(sTargetVersion); } } @@ -1255,12 +1348,12 @@ void velopack_check_for_updates(const std::string& required_version, const std:: // strictly lower than what we're running (e.g., a retracted build). bool has_required = !required_version.empty(); int ver_cmp = has_required ? compare_running_version(required_version) : 0; - bool allow_downgrade = ver_cmp > 0; // running > required → rollback scenario + bool allow_downgrade = ver_cmp > 0; // running > required -> rollback scenario ensure_update_manager(allow_downgrade); if (!sUpdateManager) return; - // Ask Velopack to check its feed — this is the source of truth + // Ask Velopack to check its feed - this is the source of truth vpkc_update_info_t* update_info = nullptr; vpkc_update_check_t result = vpkc_check_for_updates(sUpdateManager, &update_info); @@ -1286,7 +1379,7 @@ void velopack_check_for_updates(const std::string& required_version, const std:: sPendingCheckInfo = update_info; // Determine if this is mandatory: running version is below VVM's required floor - bool is_required = ver_cmp < 0; // running < required → must update + bool is_required = ver_cmp < 0; // running < required -> must update sIsRequired = is_required; if (is_required) @@ -1297,12 +1390,12 @@ void velopack_check_for_updates(const std::string& required_version, const std:: return; } - // Optional update — check user preference + // Optional update - check user preference U32 updater_setting = gSavedSettings.getU32("UpdaterServiceSetting"); if (updater_setting == 3) { - // "Install each update automatically" — download silently, apply on quit + // "Install each update automatically" - download silently, apply on quit LL_INFOS("Velopack") << "Optional update to " << target_version << ", downloading automatically (UpdaterServiceSetting=3)" << LL_ENDL; velopack_download_pending_update(); diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index eb0ec14259..12d2dfbf1e 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -32,6 +32,8 @@ #include "llversioninfo.h" #include "stringize.h" +#include "llversioninfovars.h" + #if ! defined(LL_VIEWER_CHANNEL) \ || ! defined(LL_VIEWER_VERSION_MAJOR) \ || ! defined(LL_VIEWER_VERSION_MINOR) \ @@ -52,7 +54,6 @@ LLVersionInfo::LLVersionInfo(): // macro expands to the string name of the channel, but without quotes. We // need to turn it into a quoted string. LL_TO_STRING() does that. mWorkingChannelName(LL_TO_STRING(LL_VIEWER_CHANNEL)), - build_configuration(LLBUILD_CONFIG), // set in indra/cmake/BuildVersion.cmake // instantiate an LLEventMailDrop with canonical name to listen for news // from the Viewer Version Manager mPump{new LLEventMailDrop("relnotes")}, @@ -168,7 +169,15 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity() const std::string LLVersionInfo::getBuildConfig() const { - return build_configuration; +#if LL_DEBUG + return "Debug"; +#elif LL_RELEASE_WITH_DEBUG_INFO + return "RelWithDebInfo"; +#elif LL_RELEASE_FOR_DOWNLOAD + return "Release"; +#else + return "Unknown"; +#endif } std::string LLVersionInfo::getReleaseNotes() const diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index a2b93597e6..bffee086be 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -108,7 +108,6 @@ private: // Storage for the "version and channel" string. // This will get reset too. mutable std::string mVersionChannel; - std::string build_configuration; std::string mReleaseNotes; // Store unique_ptrs to the next couple things so we don't have to explain // to every consumer of this header file all the details of each. diff --git a/indra/newview/tests/llpipeline_stub.cpp b/indra/newview/llversioninfovars.h.in index 62b71e51e5..2984f05bb3 100644 --- a/indra/newview/tests/llpipeline_stub.cpp +++ b/indra/newview/llversioninfovars.h.in @@ -1,10 +1,9 @@ /** - * @file llpipeline_stub.cpp - * @brief stub class to allow unit testing + * @file llversioninfovars.h.in * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * 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 @@ -24,9 +23,8 @@ * $/LicenseInfo$ */ -class LLPipeline -{ -public: BOOL canUseWindLightShaders() const; -}; -BOOL LLPipeline::canUseWindLightShaders() const {return TRUE;} -LLPipeline gPipeline; +#define LL_VIEWER_CHANNEL @VIEWER_CHANNEL@ +#define LL_VIEWER_VERSION_MAJOR @VIEWER_VERSION_MAJOR@ +#define LL_VIEWER_VERSION_MINOR @VIEWER_VERSION_MINOR@ +#define LL_VIEWER_VERSION_PATCH @VIEWER_VERSION_PATCH@ +#define LL_VIEWER_VERSION_BUILD @VIEWER_VERSION_REVISION@ diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index fd462fb225..296ba1d715 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -183,7 +183,7 @@ void LLViewerAssetStorage::storeAssetData( else { // LLAssetStorage metric: Successful Request - S32 size = LLFileSystem::getFileSize(asset_id, asset_type); + S32 size = vfile.getSize(); const char *message = "Added to upload queue"; reportMetric( asset_id, asset_type, LLStringUtil::null, LLUUID::null, size, MR_OKAY, __FILE__, __LINE__, message ); @@ -280,7 +280,7 @@ void LLViewerAssetStorage::storeAssetData( LL_DEBUGS("AssetStorage") << "ASSET_ID: " << asset_id << LL_ENDL; S32 size = 0; - LLFILE* fp = LLFile::fopen(filename, "rb"); + LLFILE* fp = LLFile::fopen(filename, LLFILE_MODE("rb")); if (fp) { fseek(fp, 0, SEEK_END); @@ -506,7 +506,7 @@ void LLViewerAssetStorage::assetRequestCoro( if (!gAgent.getRegion()->capabilitiesReceived()) { - LL_WARNS_ONCE("ViewerAsset") << "Waiting for capabilities" << LL_ENDL; + LL_INFOS_ONCE("ViewerAsset") << "Waiting for capabilities" << LL_ENDL; LLEventStream capsRecv("waitForCaps", true); @@ -533,8 +533,8 @@ void LLViewerAssetStorage::assetRequestCoro( return; } - LL_WARNS_ONCE("ViewerAsset") << "capsRecv got event" << LL_ENDL; - LL_WARNS_ONCE("ViewerAsset") << "region " << gAgent.getRegion() << " mViewerAssetUrl " << mViewerAssetUrl << LL_ENDL; + LL_INFOS_ONCE("ViewerAsset") << "capsRecv got event" << LL_ENDL; + LL_INFOS_ONCE("ViewerAsset") << "region " << gAgent.getRegion() << " mViewerAssetUrl " << mViewerAssetUrl << LL_ENDL; } if (mViewerAssetUrl.empty() && gAgent.getRegion()) { diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index 46c76e2953..c0bd5bc10d 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -45,11 +45,7 @@ #include "llappviewer.h" #include "llviewerstats.h" #include "llfilesystem.h" -#include "llgesturemgr.h" -#include "llpreviewnotecard.h" -#include "llpreviewgesture.h" #include "llcoproceduremanager.h" -#include "llthread.h" #include "llkeyframemotion.h" #include "lldatapacker.h" #include "llvoavatarself.h" @@ -405,6 +401,7 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile() std::string errorMessage; std::string errorLabel; + std::error_code ec; bool error = false; @@ -475,30 +472,38 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile() error = true; // read from getFileName() - LLAPRFile infile; - infile.open(getFileName(),LL_APR_RB); - if (!infile.getFileHandle()) + LLFile infile(getFileName(), LLFile::in | LLFile::binary, ec); + if (ec || !infile) { LL_WARNS() << "Couldn't open file for reading: " << getFileName() << LL_ENDL; errorMessage = llformat("Failed to open animation file %s\n", getFileName().c_str()); } else { - S32 size = LLAPRFile::size(getFileName()); + S64 size = infile.size(ec); + if (ec || size <= 0) + { + LLError::LLUserWarningMsg::showMissingFiles(); + LL_ERRS() << "Invalid file" << LL_ENDL; + } + else if (size > INT_MAX) + { + LL_ERRS() << "File " << getFileName() << " is too big, size: " << size << LL_ENDL; + } U8* buffer = new(std::nothrow) U8[size]; if (!buffer) { LLError::LLUserWarningMsg::showOutOfMemory(); LL_ERRS() << "Bad memory allocation for buffer, size: " << size << LL_ENDL; } - S32 size_read = infile.read(buffer,size); - if (size_read != size) + S64 size_read = infile.read(buffer, size, ec); + if (ec || size_read != size) { errorMessage = llformat("Failed to read animation file %s: wanted %d bytes, got %d\n", getFileName().c_str(), size, size_read); } else { - LLDataPackerBinaryBuffer dp(buffer, size); + LLDataPackerBinaryBuffer dp(buffer, (S32)size); LLKeyframeMotion *motionp = new LLKeyframeMotion(getAssetId()); motionp->setCharacter(gAgentAvatarp); if (motionp->deserialize(dp, getAssetId(), false)) @@ -544,18 +549,17 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile() setAssetType(assetType); // copy this file into the cache for upload - S32 file_size; - LLAPRFile infile; - infile.open(filename, LL_APR_RB, NULL, &file_size); - if (infile.getFileHandle()) + LLFile infile(filename, LLFile::in | LLFile::binary, ec); + if (!ec && infile.size(ec) > 0) { LLFileSystem file(getAssetId(), assetType, LLFileSystem::APPEND); + S64 read_bytes; const S32 buf_size = 65536; U8 copy_buf[buf_size]; - while ((file_size = infile.read(copy_buf, buf_size))) + while (((read_bytes = infile.read(copy_buf, buf_size, ec))) > 0) { - file.write(copy_buf, file_size); + file.write(copy_buf, (S32)read_bytes); } } else @@ -569,7 +573,6 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile() } return LLSD(); - } //========================================================================= @@ -808,19 +811,19 @@ bool LLBufferedAssetUploadInfo::failedUpload(LLSD &result, std::string &reason) //========================================================================= -LLScriptAssetUpload::LLScriptAssetUpload(LLUUID itemId, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed): +LLScriptAssetUpload::LLScriptAssetUpload(LLUUID itemId, std::string compileTarget, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed) : LLBufferedAssetUploadInfo(itemId, LLAssetType::AT_LSL_TEXT, buffer, finish, failed), mExerienceId(), - mTargetType(MONO), + mCompileTarget(compileTarget), mIsRunning(false) { } -LLScriptAssetUpload::LLScriptAssetUpload(LLUUID taskId, LLUUID itemId, TargetType_t targetType, +LLScriptAssetUpload::LLScriptAssetUpload(LLUUID taskId, LLUUID itemId, std::string compileTarget, bool isRunning, LLUUID exerienceId, std::string buffer, taskUploadFinish_f finish, uploadFailed_f failed): LLBufferedAssetUploadInfo(taskId, itemId, LLAssetType::AT_LSL_TEXT, buffer, finish, failed), mExerienceId(exerienceId), - mTargetType(targetType), + mCompileTarget(compileTarget), mIsRunning(isRunning) { } @@ -832,14 +835,14 @@ LLSD LLScriptAssetUpload::generatePostBody() if (getTaskId().isNull()) { body["item_id"] = getItemId(); - body["target"] = "mono"; + body["target"] = getCompileTarget(); } else { body["task_id"] = getTaskId(); body["item_id"] = getItemId(); body["is_script_running"] = getIsRunning(); - body["target"] = (getTargetType() == MONO) ? "mono" : "lsl2"; + body["target"] = getCompileTarget(); body["experience"] = getExerienceId(); } diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h index c627e9dbb8..9692c4814b 100644 --- a/indra/newview/llviewerassetupload.h +++ b/indra/newview/llviewerassetupload.h @@ -256,25 +256,19 @@ private: class LLScriptAssetUpload : public LLBufferedAssetUploadInfo { public: - enum TargetType_t - { - LSL2, - MONO - }; - - LLScriptAssetUpload(LLUUID itemId, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed); - LLScriptAssetUpload(LLUUID taskId, LLUUID itemId, TargetType_t targetType, + LLScriptAssetUpload(LLUUID itemId, std::string compileTarget, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed); + LLScriptAssetUpload(LLUUID taskId, LLUUID itemId, std::string compileTarget, bool isRunning, LLUUID exerienceId, std::string buffer, taskUploadFinish_f finish, uploadFailed_f failed); virtual LLSD generatePostBody(); LLUUID getExerienceId() const { return mExerienceId; } - TargetType_t getTargetType() const { return mTargetType; } + const std::string& getCompileTarget() const { return mCompileTarget; } bool getIsRunning() const { return mIsRunning; } private: LLUUID mExerienceId; - TargetType_t mTargetType; + std::string mCompileTarget; bool mIsRunning; }; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 6d42cf2347..c8bc419947 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -294,9 +294,14 @@ static bool handleLUTBufferChanged(const LLSD& newvalue) return true; } -static bool handleAnisotropicChanged(const LLSD& newvalue) +static bool handleAnisotropicFilteringChanged(const LLSD& newval) { - LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean(); + F32 val = static_cast<F32>(newval.asReal()); + if (val > gGLManager.mMaxAnisotropy) + { + val = llclamp(val, 0.f, gGLManager.mMaxAnisotropy); + } + LLRender::sAnisotropicFilteringLevel = val; LLImageGL::dirtyTexOptions(); return true; } @@ -318,6 +323,12 @@ static bool handleVSyncChanged(const LLSD& newvalue) return true; } +static bool validateAnisotropicFiltering(const LLSD& val) +{ + S32 filter_level = val.asInteger(); + return filter_level == 0 || filter_level == 2 || filter_level == 4 || filter_level == 8 || filter_level == 16; +} + static bool handleVolumeLODChanged(const LLSD& newvalue) { LLVOVolume::sLODFactor = llclamp((F32) newvalue.asReal(), 0.01f, MAX_LOD_FACTOR); @@ -436,16 +447,6 @@ static bool handleUploadBakedTexOldChanged(const LLSD& newvalue) return true; } - -static bool handleWLSkyDetailChanged(const LLSD&) -{ - if (gSky.mVOWLSkyp.notNull()) - { - gSky.mVOWLSkyp->updateGeometry(gSky.mVOWLSkyp->mDrawable); - } - return true; -} - static bool handleRepartition(const LLSD&) { if (gPipeline.isInit()) @@ -831,10 +832,12 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "RenderUIBuffer", handleWindowResized); setting_setup_signal_listener(gSavedSettings, "RenderDepthOfField", handleReleaseGLBufferChanged); setting_setup_signal_listener(gSavedSettings, "RenderFSAAType", handleReleaseGLBufferChanged); + setting_setup_signal_listener(gSavedSettings, "RenderHighPrecisionPostProcess", handleReleaseGLBufferChanged); setting_setup_signal_listener(gSavedSettings, "RenderSpecularResX", handleLUTBufferChanged); setting_setup_signal_listener(gSavedSettings, "RenderSpecularResY", handleLUTBufferChanged); setting_setup_signal_listener(gSavedSettings, "RenderSpecularExponent", handleLUTBufferChanged); - setting_setup_signal_listener(gSavedSettings, "RenderAnisotropic", handleAnisotropicChanged); + setting_setup_signal_listener(gSavedSettings, "RenderAnisotropicLevel", handleAnisotropicFilteringChanged); + gSavedSettings.getControl("RenderAnisotropicLevel")->getValidateSignal()->connect(boost::bind(&validateAnisotropicFiltering, _2)); setting_setup_signal_listener(gSavedSettings, "RenderShadowResolutionScale", handleShadowsResized); setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleReleaseGLBufferChanged); setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleSetShaderChanged); @@ -891,7 +894,6 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "MuteVoice", handleAudioVolumeChanged); setting_setup_signal_listener(gSavedSettings, "MuteAmbient", handleAudioVolumeChanged); setting_setup_signal_listener(gSavedSettings, "MuteUI", handleAudioVolumeChanged); - setting_setup_signal_listener(gSavedSettings, "WLSkyDetail", handleWLSkyDetailChanged); setting_setup_signal_listener(gSavedSettings, "JoystickAxis0", handleJoystickChanged); setting_setup_signal_listener(gSavedSettings, "JoystickAxis1", handleJoystickChanged); setting_setup_signal_listener(gSavedSettings, "JoystickAxis2", handleJoystickChanged); diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp index 6f77e21fcc..f8e829deb9 100644 --- a/indra/newview/llviewercontrollistener.cpp +++ b/indra/newview/llviewercontrollistener.cpp @@ -65,6 +65,11 @@ LLViewerControlListener::LLViewerControlListener() grouphelp + replyhelp, &LLViewerControlListener::set, LLSDMap("group", LLSD())("key", LLSD())); + add("set_notation", + std::string("Set [\"group\"] TYPE_LLSD control [\"key\"] by parsing [\"value\"] as LLSD notation.\n") + + grouphelp + replyhelp, + &LLViewerControlListener::set_notation, + LLSDMap("group", LLSD())("key", LLSD())("value", LLSD())); add("toggle", std::string("Toggle [\"group\"] control [\"key\"], if boolean\n") + grouphelp + replyhelp, &LLViewerControlListener::toggle, @@ -150,6 +155,36 @@ void LLViewerControlListener::set(LLSD const & request) } //static +void LLViewerControlListener::set_notation(LLSD const& request) +{ + Info info(request); + if (!info.control) + return; + + if (!info.control->isType(TYPE_LLSD)) + { + info.response.error(STRINGIZE("set_notation requires a TYPE_LLSD control, but '" + << info.key << "' in group '" << info.groupname + << "' has type " + << LLControlGroup::typeEnumToString(info.control->type()))); + return; + } + + if (!request["value"].isString()) + { + info.response.error(STRINGIZE("set_notation requires [\"value\"] to be a string " + "containing LLSD notation, but received type: " + << LLSD::typeString(request["value"].type()))); + return; + } + + if (!info.control->setValueFromNotation(request["value"].asString())) + { + info.response.error(STRINGIZE("set_notation failed to parse notation")); + } +} + +//static void LLViewerControlListener::toggle(LLSD const & request) { Info info(request); diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h index 346acac439..c5a3a31baf 100644 --- a/indra/newview/llviewercontrollistener.h +++ b/indra/newview/llviewercontrollistener.h @@ -41,6 +41,7 @@ public: private: static void set(LLSD const & event_data); + static void set_notation(LLSD const & event_data); static void toggle(LLSD const & event_data); static void get(LLSD const & event_data); static void groups(LLSD const & event_data); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 1b690fda9b..ccd17be939 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -55,7 +55,6 @@ #include "llmemory.h" #include "llparcel.h" #include "llperfstats.h" -#include "llpostprocess.h" #include "llrender.h" #include "llscenemonitor.h" #include "llsdjson.h" @@ -1139,7 +1138,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLGLSLShader::finishProfile(stats); auto report_name = getProfileStatsFilename(); - std::ofstream outf(report_name); + llofstream outf(report_name); if (! outf) { LL_WARNS() << "Couldn't write to " << std::quoted(report_name) << LL_ENDL; @@ -1205,15 +1204,12 @@ std::string getProfileStatsFilename() // same second), may produce (e.g.) sec==61, but avoids collisions and // preserves chronological filename sort order. std::string name; - std::error_code ec; do { // base + missing 2-digit seconds, append ".json" // post-increment sec in case we have to try again name = stringize(base, std::setw(2), std::setfill('0'), sec++, ".json"); - } while (std::filesystem::exists(fsyspath(name), ec)); - // Ignoring ec means we might potentially return a name that does already - // exist -- but if we can't check its existence, what more can we do? + } while (LLFile::exists(name)); return name; } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 2a2542ff57..52da6b1a37 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -79,6 +79,7 @@ #include "llfloaterfonttest.h" #include "llfloaterforgetuser.h" #include "llfloatergesture.h" +#include "llfloatergestureautocompletepicker.h" #include "llfloatergltfasseteditor.h" #include "llfloatergodtools.h" #include "llfloatergridstatus.h" @@ -87,7 +88,6 @@ #include "llfloaterhoverheight.h" #include "llquickprefs.h" // Quick Preferences floater (Firestorm port) #include "mpfloatertuning.h" -#include "llfloaterhowto.h" #include "llfloaterhud.h" #include "llfloaterimagepreview.h" #include "llfloaterimsession.h" @@ -133,6 +133,7 @@ #include "llfloatersavecamerapreset.h" #include "llfloatersaveprefpreset.h" #include "llfloatersceneloadstats.h" +#include "llfloaterscripting.h" #include "llfloaterscriptdebug.h" #include "llfloaterscriptedprefs.h" #include "llfloaterscriptlimits.h" @@ -386,6 +387,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>); LLFloaterReg::add("forget_username", "floater_forget_user.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterForgetUser>); + LLFloaterReg::add("gesture_autocomplete_picker", "floater_gesture_autocomplete_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGestureAutocompletePicker>); LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>); LLFloaterReg::add("gltf_asset_editor", "floater_gltf_asset_editor.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGLTFAssetEditor>); LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>); @@ -498,6 +500,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>); LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>); + LLFloaterReg::add("scripting_settings", "floater_scripting_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScripting>); LLFloaterReg::add("my_scripts", "floater_my_scripts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyScripts>); LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_color", "floater_settings_color.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsColor>); @@ -511,7 +514,6 @@ void LLViewerFloaterReg::registerFloaters() 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>); LLFloaterUIPreviewUtil::registerFloater(); diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp index 3c79f0b21c..5741d7f5fb 100644 --- a/indra/newview/llviewerinput.cpp +++ b/indra/newview/llviewerinput.cpp @@ -1430,7 +1430,7 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename) // file in app_settings is supposed to be up to date // this is only for the file from user_settings LL_INFOS("ViewerInput") << "Updating file " << filename << " to a newer version" << LL_ENDL; - LLFILE *fp = LLFile::fopen(filename, "w"); + LLFILE *fp = LLFile::fopen(filename, LLFILE_MODE("w")); if (fp != NULL) { LLXMLNode::writeHeaderToFile(fp); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index efa3f5cd1e..200fd619b1 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2014, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -72,6 +72,7 @@ #include "llhttpretrypolicy.h" #include "llsettingsvo.h" #include "llinventorylistener.h" +#include "llviewerassetupload.h" LLInventoryListener sInventoryListener; @@ -505,6 +506,16 @@ bool LLViewerInventoryItem::unpackMessage(const LLSD& item) LLLocalizedInventoryItemsDictionary::getInstance()->localizeInventoryObjectName(mName); + // Parse script runtime state from task inventory cap + if (item.has("running")) + { + mIsRunning = item["running"].asBoolean(); + } + if (item.has("faulted")) + { + mIsFaulted = item["faulted"].asBoolean(); + } + mIsComplete = true; return rv; } @@ -673,6 +684,25 @@ void LLViewerInventoryCategory::setVersion(S32 version) mVersion = version; } +const std::string& LLViewerInventoryCategory::getDisplayName() const +{ + if (mNeedsDisplayNameUpdate) + { + buildDisplayName(); + } + if (!mDisplayName.empty()) + { + return mDisplayName; + } + return getName(); +} + +void LLViewerInventoryCategory::invalidateDisplayName() +{ + mNeedsDisplayNameUpdate = true; + mDisplayName.clear(); +} + bool LLViewerInventoryCategory::fetch(S32 expiry_seconds) { if((VERSION_UNKNOWN == getVersion()) @@ -889,6 +919,34 @@ void LLViewerInventoryCategory::localizeName() LLLocalizedInventoryItemsDictionary::getInstance()->localizeInventoryObjectName(mName); } +void LLViewerInventoryCategory::buildDisplayName() const +{ + // Secure and library folders can't be renamed, + // so we only need to do this once. + mNeedsDisplayNameUpdate = false; + + //"Accessories" inventory category has folder type FT_NONE. So, this folder + //can not be detected as protected with LLFolderType::lookupIsProtectedType + // + // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder) + // Translation of Accessories folder in Library inventory folder + LLFolderType::EType preferred_type = getPreferredType(); + + bool is_accessories = false; + if (getName() == "Accessories") + { + // To ensure that Accessories folder is in Library we have to check its parent folder. + const LLUUID& parent_folder_id = getParentUUID(); + is_accessories = (parent_folder_id == gInventory.getLibraryRootFolderID()); + } + + if (is_accessories || LLFolderType::lookupIsProtectedType(preferred_type)) + { + // All predefined folders have translations in strings.xml. + LLTrans::findString(mDisplayName, std::string("InvFolder ") + getName(), LLSD()); + } +} + // virtual bool LLViewerInventoryCategory::unpackMessage(const LLSD& category) { @@ -1715,6 +1773,7 @@ void create_new_item(const std::string& name, std::function<void(const LLUUID&)> created_cb = nullptr) { std::string desc; + U8 subtype = NO_INV_SUBTYPE; LLViewerAssetType::generateDescriptionFor(asset_type, desc); next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER; @@ -1726,6 +1785,20 @@ void create_new_item(const std::string& name, { cb = new LLBoostFuncInventoryCallback(create_script_cb); next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Scripts"); + + LLViewerRegion* region = gAgent.getRegion(); + if (region && region->simulatorFeaturesReceived()) + { + // *TODO* Setting the subtype for the script will cause the server to select + // either the LSL or Lua default script. We should perhaps allow the user to + // select which type of script they want to create. + LLSD simulatorFeatures; + region->getSimulatorFeatures(simulatorFeatures); + if (simulatorFeatures["LuaScriptsEnabled"].asBoolean()) + { + subtype = SST_LUA; + } + } break; } @@ -1768,7 +1841,7 @@ void create_new_item(const std::string& name, desc, asset_type, inv_type, - NO_INV_SUBTYPE, + subtype, next_owner_perm, cb); } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index a42bdaa2b0..6e2e953106 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2026, 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 @@ -42,6 +42,8 @@ class LLViewerInventoryCategory; class LLInventoryCallback; class LLAvatarName; +constexpr U8 NO_INV_SUBTYPE{ 0 }; + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLViewerInventoryItem // @@ -149,6 +151,10 @@ public: }; LLTransactionID getTransactionID() const { return mTransactionID; } + // Script runtime state (from task inventory cap) + bool getIsRunning() const { return mIsRunning; } + bool getIsFaulted() const { return mIsFaulted; } + bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory. LLViewerInventoryItem *getLinkedItem() const; LLViewerInventoryCategory *getLinkedCategory() const; @@ -166,6 +172,10 @@ public: public: bool mIsComplete; LLTransactionID mTransactionID; + + // Script runtime state (only valid for task inventory scripts) + bool mIsRunning = false; + bool mIsFaulted = false; }; @@ -209,6 +219,13 @@ public: S32 getVersion() const; void setVersion(S32 version); + const std::string& getDisplayName() const; + // The display name gets cached on demand, so needs a cleanup method. + // But in practice only secure folders' display name mismatches + // actual name, and those folders can't be renamed, so in practice + // this is useless unless we want to free memory. + void invalidateDisplayName(); + // Returns true if a fetch was issued (not nessesary in progress). // no requests will happen during expiry_seconds even if fetch completed bool fetch(S32 expiry_seconds = 10); @@ -253,6 +270,19 @@ protected: S32 mDescendentCount; EFetchType mFetching; LLFrameTimer mDescendentsRequested; + + // Display names are generated on demand and cached. + // buildDisplayName is essentially a way to localize + // system and library folders. + // + // TODO: This is on demand and mutable because that's how it + // worked in inventory bridge, before it was moved. + // But system folders always get loaded, it's likely better + // to just generate from the get go. + // Consider merging with localizeName. + void buildDisplayName() const; + mutable std::string mDisplayName; + mutable bool mNeedsDisplayNameUpdate = true; }; class LLInventoryCallback : public LLRefCount @@ -359,8 +389,6 @@ public: extern LLInventoryCallbackManager gInventoryCallbacks; -const U8 NO_INV_SUBTYPE{ 0 }; - // *TODO: Find a home for these void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, const LLUUID& parent, const LLTransactionID& transaction_id, diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp index 3c5c4752df..125465f326 100644 --- a/indra/newview/llviewerjoint.cpp +++ b/indra/newview/llviewerjoint.cpp @@ -145,6 +145,7 @@ U32 LLViewerJoint::render( F32 pixelArea, bool first_pass, bool is_dummy ) { // LLViewerJoint is derived from LLAvatarJoint, // all children of LLAvatarJoint are assumed to be LLAvatarJoint + // LLJoint is not used directly and is always LLAvatarJoint LLAvatarJoint* joint = static_cast<LLAvatarJoint*>(j); F32 jointLOD = joint->getLOD(); if (pixelArea >= jointLOD || sDisableLOD) diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h index 7f52ca9623..57959ec2fc 100644 --- a/indra/newview/llviewerjoint.h +++ b/indra/newview/llviewerjoint.h @@ -39,9 +39,10 @@ class LLViewerJointMesh; //----------------------------------------------------------------------------- // class LLViewerJoint //----------------------------------------------------------------------------- -class LLViewerJoint : +class alignas(16) LLViewerJoint : public virtual LLAvatarJoint { + LL_ALIGN_NEW public: LLViewerJoint(); LLViewerJoint(S32 joint_num); diff --git a/indra/newview/llviewerjointattachment.h b/indra/newview/llviewerjointattachment.h index fe66949f73..12075177b3 100644 --- a/indra/newview/llviewerjointattachment.h +++ b/indra/newview/llviewerjointattachment.h @@ -40,9 +40,10 @@ class LLViewerObject; //----------------------------------------------------------------------------- // class LLViewerJointAttachment //----------------------------------------------------------------------------- -class LLViewerJointAttachment : +class alignas(16) LLViewerJointAttachment : public LLViewerJoint { + LL_ALIGN_NEW public: LLViewerJointAttachment(); virtual ~LLViewerJointAttachment(); diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 3ecf3c39b2..a910d8ec2a 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -56,12 +56,6 @@ #include "llmatrix4a.h" #include "llperfstats.h" -#if !LL_DARWIN && !LL_LINUX && !__FreeBSD__ -extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB; -extern PFNGLWEIGHTFVARBPROC glWeightfvARB; -extern PFNGLVERTEXBLENDARBPROC glVertexBlendARB; -#endif - //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // LLViewerJointMesh @@ -95,10 +89,9 @@ const S32 NUM_AXES = 3; // rotation Z 0-n // pivot parent 0-n -- child = n+1 -static LLMatrix4 gJointMatUnaligned[32]; -static LLMatrix4a gJointMatAligned[32]; -static LLMatrix3 gJointRotUnaligned[32]; -static LLVector4 gJointPivot[32]; +static LLMatrix4 gJointMatUnaligned[LL_CHARACTER_MAX_JOINTS_PER_MESH]; +static LLMatrix3 gJointRotUnaligned[LL_CHARACTER_MAX_JOINTS_PER_MESH]; +static LLVector4 gJointPivot[LL_CHARACTER_MAX_JOINTS_PER_MESH]; //----------------------------------------------------------------------------- // uploadJointMatrices() @@ -107,18 +100,14 @@ void LLViewerJointMesh::uploadJointMatrices() { S32 joint_num; LLPolyMesh *reference_mesh = mMesh->getReferenceMesh(); - LLDrawPool *poolp = mFace ? mFace->getPool() : NULL; - bool hardware_skinning = (poolp && poolp->getShaderLevel() > 0); //calculate joint matrices - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); joint_num++) + size_t num_joints = llmin(reference_mesh->mJointRenderData.size(), LL_CHARACTER_MAX_JOINTS_PER_MESH); + for (joint_num = 0; joint_num < num_joints; joint_num++) { LLMatrix4 joint_mat = *reference_mesh->mJointRenderData[joint_num]->mWorldMatrix; - if (hardware_skinning) - { - joint_mat *= LLDrawPoolAvatar::getModelView(); - } + joint_mat *= LLDrawPoolAvatar::getModelView(); gJointMatUnaligned[joint_num] = joint_mat; gJointRotUnaligned[joint_num] = joint_mat.getMat3(); } @@ -137,12 +126,20 @@ void LLViewerJointMesh::uploadJointMatrices() LLVector4 parent_pivot(sj->mRootToParentJointSkinOffset); parent_pivot.mV[VW] = 0.f; gJointPivot[j++] = parent_pivot; + if (j >= LL_CHARACTER_MAX_JOINTS_PER_MESH) + { + break; + } } LLVector4 child_pivot(sj->mRootToJointSkinOffset); child_pivot.mV[VW] = 0.f; gJointPivot[j++] = child_pivot; + if (j >= LL_CHARACTER_MAX_JOINTS_PER_MESH) + { + break; + } last_pivot_uploaded = true; } @@ -162,12 +159,10 @@ void LLViewerJointMesh::uploadJointMatrices() } // upload matrices - if (hardware_skinning) - { GLfloat mat[45*4]; memset(mat, 0, sizeof(GLfloat)*45*4); - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); joint_num++) + for (joint_num = 0; joint_num < num_joints; joint_num++) { gJointMatUnaligned[joint_num].transpose(); @@ -184,15 +179,6 @@ void LLViewerJointMesh::uploadJointMatrices() LLGLSLShader::sCurBoundShaderPtr->uniform4fv(LLViewerShaderMgr::AVATAR_MATRIX, 45, mat); } stop_glerror(); - } - else - { - //load gJointMatUnaligned into gJointMatAligned - for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.size(); ++joint_num) - { - gJointMatAligned[joint_num].loadu(gJointMatUnaligned[joint_num]); - } - } } //-------------------------------------------------------------------- @@ -221,6 +207,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, bool first_pass, bool is_dummy) if (!mValid || !mMesh || !mFace || !mVisible || !mFace->getVertexBuffer() || mMesh->getNumFaces() == 0 || + mMesh->mFaceVertexCount == 0 || LLGLSLShader::sCurBoundShaderPtr == NULL) { return 0; @@ -242,10 +229,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, bool first_pass, bool is_dummy) stop_glerror(); -#if GL_VERSION_1_1 - LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), 0.f); -#endif - //---------------------------------------------------------------- // setup current texture //---------------------------------------------------------------- @@ -294,12 +277,9 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, bool first_pass, bool is_dummy) if (mMesh->hasWeights()) { - if ((mFace->getPool()->getShaderLevel() > 0)) + if (first_pass) { - if (first_pass) - { - uploadJointMatrices(); - } + uploadJointMatrices(); } buff->setBuffer(); @@ -359,15 +339,6 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, bool damp_w return; } - LLDrawPool *poolp = mFace->getPool(); - bool hardware_skinning = (poolp && poolp->getShaderLevel() > 0); - - if (!hardware_skinning && terse_update) - { //no need to do terse updates if we're doing software vertex skinning - // since mMesh is being copied into mVertexBuffer every frame - return; - } - LL_PROFILE_ZONE_SCOPED; LLStrider<LLVector3> verticesp; @@ -451,75 +422,8 @@ bool LLViewerJointMesh::updateLOD(F32 pixel_area, bool activate) return (valid != activate); } -// static -void LLViewerJointMesh::updateGeometry(LLFace *mFace, LLPolyMesh *mMesh) -{ - LLStrider<LLVector3> o_vertices; - LLStrider<LLVector3> o_normals; - - //get vertex and normal striders - LLVertexBuffer* buffer = mFace->getVertexBuffer(); - buffer->getVertexStrider(o_vertices, 0); - buffer->getNormalStrider(o_normals, 0); - - F32* __restrict vert = o_vertices[0].mV; - F32* __restrict norm = o_normals[0].mV; - - const F32* __restrict weights = mMesh->getWeights(); - const LLVector4a* __restrict coords = (LLVector4a*) mMesh->getCoords(); - const LLVector4a* __restrict normals = (LLVector4a*) mMesh->getNormals(); - - U32 offset = mMesh->mFaceVertexOffset*4; - vert += offset; - norm += offset; - - for (U32 index = 0; index < mMesh->getNumVertices(); index++) - { - // equivalent to joint = floorf(weights[index]); - S32 joint = _mm_cvtt_ss2si(_mm_load_ss(weights+index)); - F32 w = weights[index] - joint; - - LLMatrix4a gBlendMat; - - if (w != 0.f) - { - // blend between matrices and apply - gBlendMat.setLerp(gJointMatAligned[joint+0], - gJointMatAligned[joint+1], w); - - LLVector4a res; - gBlendMat.affineTransform(coords[index], res); - res.store4a(vert+index*4); - gBlendMat.rotate(normals[index], res); - res.store4a(norm+index*4); - } - else - { // No lerp required in this case. - LLVector4a res; - gJointMatAligned[joint].affineTransform(coords[index], res); - res.store4a(vert+index*4); - gJointMatAligned[joint].rotate(normals[index], res); - res.store4a(norm+index*4); - } - } - - buffer->unmapBuffer(); -} - void LLViewerJointMesh::updateJointGeometry() { - if (!(mValid - && mMesh - && mFace - && mMesh->hasWeights() - && mFace->getVertexBuffer() - && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) == 0)) - { - return; - } - - uploadJointMatrices(); - updateGeometry(mFace, mMesh); } void LLViewerJointMesh::dump() diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h index cfe8ecdb67..ec410a3138 100644 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -41,8 +41,9 @@ class LLViewerTexLayerSet; //----------------------------------------------------------------------------- // class LLViewerJointMesh //----------------------------------------------------------------------------- -class LLViewerJointMesh : public LLAvatarJointMesh, public LLViewerJoint +class alignas(16) LLViewerJointMesh : public LLAvatarJointMesh, public LLViewerJoint { + LL_ALIGN_NEW public: // Constructor LLViewerJointMesh(); @@ -67,11 +68,6 @@ public: void dump() override; bool isAnimatable() const override { return false; } - -private: - - //copy mesh into given face's vertex buffer, applying current animation pose - static void updateGeometry(LLFace* face, LLPolyMesh* mesh); }; #endif // LL_LLVIEWERJOINTMESH_H diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 92bfc9e0f5..e95335a377 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -560,55 +560,34 @@ LLViewerMedia::impl_list &LLViewerMedia::getPriorityList() // This is the predicate function used to sort sViewerMediaImplList by priority. bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2) { - if(i1->isForcedUnloaded() && !i2->isForcedUnloaded()) + // isForcedUnloaded can be pricey, avoid a repeat, + // note that this one is specifically i2, when everything else is i1 + // Consider making isForcedUnloaded cache the value temporarily? + bool i2_forced_unloaded = i2->isForcedUnloaded(); + if (i1->isForcedUnloaded() != i2_forced_unloaded) { // Muted or failed items always go to the end of the list, period. - return false; - } - else if(i2->isForcedUnloaded() && !i1->isForcedUnloaded()) - { - // Muted or failed items always go to the end of the list, period. - return true; + return i2_forced_unloaded; } - else if(i1->hasFocus()) + else if(i1->hasFocus() != i2->hasFocus()) { // The item with user focus always comes to the front of the list, period. - return true; + return i1->hasFocus(); } - else if(i2->hasFocus()) - { - // The item with user focus always comes to the front of the list, period. - return false; - } - else if(i1->isParcelMedia()) - { - // The parcel media impl sorts above all other inworld media, unless one has focus. - return true; - } - else if(i2->isParcelMedia()) + else if(i1->isParcelMedia() != i2->isParcelMedia()) { // The parcel media impl sorts above all other inworld media, unless one has focus. - return false; + return i1->isParcelMedia(); } - else if(i1->getUsedInUI() && !i2->getUsedInUI()) + else if (i1->getUsedInUI() != i2->getUsedInUI()) { - // i1 is a UI element, i2 is not. This makes i1 "less than" i2, so it sorts earlier in our list. - return true; + // UI elements sort above inworld media. + return i1->getUsedInUI(); } - else if(i2->getUsedInUI() && !i1->getUsedInUI()) - { - // i2 is a UI element, i1 is not. This makes i2 "less than" i1, so it sorts earlier in our list. - return false; - } - else if(i1->isPlayable() && !i2->isPlayable()) - { - // Playable items sort above ones that wouldn't play even if they got high enough priority - return true; - } - else if(!i1->isPlayable() && i2->isPlayable()) + else if (i1->isPlayable() != i2->isPlayable()) { // Playable items sort above ones that wouldn't play even if they got high enough priority - return false; + return i1->isPlayable(); } else if(i1->getInterest() == i2->getInterest()) { @@ -1821,6 +1800,13 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ } else { +#if LL_LINUX || __FreeBSD__ + if(plugin_basename == "media_plugin_gstreamer10" && gSavedSettings.getBOOL("MediaPluginForceVLC")) + { + plugin_basename = "media_plugin_libvlc"; + } +#endif + std::string launcher_name = gDirUtilp->getLLPluginLauncher(); std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename); #if __FreeBSD__ @@ -1835,12 +1821,11 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ user_data_path_cache += gDirUtilp->getDirDelimiter(); // See if the plugin executable exists - llstat s; - if(LLFile::stat(launcher_name, &s)) + if (!LLFile::isfile(launcher_name)) { LL_WARNS_ONCE("Media") << "Couldn't find launcher at " << launcher_name << LL_ENDL; } - else if(LLFile::stat(plugin_name, &s)) + else if (!LLFile::isfile(plugin_name)) { LL_WARNS_ONCE("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL; } @@ -3658,7 +3643,7 @@ LLViewerMediaImpl::canUndo() const if (mMediaSource) return mMediaSource->canUndo(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3678,7 +3663,7 @@ LLViewerMediaImpl::canRedo() const if (mMediaSource) return mMediaSource->canRedo(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3758,7 +3743,7 @@ LLViewerMediaImpl::canDoDelete() const if (mMediaSource) return mMediaSource->canDoDelete(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3778,7 +3763,7 @@ LLViewerMediaImpl::canSelectAll() const if (mMediaSource) return mMediaSource->canSelectAll(); else - return FALSE; + return false; } void LLViewerMediaImpl::setUpdated(bool updated) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 60ac866b7d..d726091f79 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -79,6 +79,7 @@ #include "llfloatersearch.h" #include "llfloaterscriptdebug.h" #include "llfloatersnapshot.h" +#include "llscripteditorws.h" #include "llfloatertools.h" #include "llfloaterworldmap.h" #include "llfloaterbuildoptions.h" @@ -127,6 +128,7 @@ #include "llviewernetwork.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" +#include "llviewerregion.h" #include "llviewerstats.h" #include "llviewerstatsrecorder.h" #include "llvlcomposition.h" @@ -2310,7 +2312,7 @@ class LLAdvancedDropPacket : public view_listener_t { bool handleEvent(const LLSD& userdata) { - gMessageSystem->mPacketRing.dropPackets(1); + gMessageSystem->dropPackets(1); return true; } }; @@ -3723,7 +3725,7 @@ class LLAvatarSetImpostorMode : public view_listener_t return false; } - LLVOAvatar::cullAvatarsByPixelArea(); + LLVOAvatar::setCullNeedsUpdate(); return true; } // handleEvent() }; @@ -4102,17 +4104,6 @@ bool enable_estate_eject_ban(const LLSD& avatar_id) return region->getOwner() == gAgent.getID() || region->isEstateManager(); } -bool my_profile_visible() -{ - LLFloater* floaterp = LLAvatarActions::getProfileFloater(gAgentID); - return floaterp && floaterp->isInVisibleChain(); -} - -bool picks_tab_visible() -{ - return my_profile_visible() && LLAvatarActions::isPickTabSelected(gAgentID); -} - bool enable_freeze_eject(const LLSD& avatar_id) { // Use avatar_id if available, otherwise default to right-click avatar @@ -5210,6 +5201,31 @@ static void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) derez_objects(dest, dest_id, first_region, error, NULL); } +bool save_object_back_to_contents(LLViewerObject* object, const LLUUID& source_task_id) +{ + if (!object || source_task_id.isNull()) + { + return false; + } + + LLViewerRegion* first_region = object->getRegion(); + if (!first_region) + { + return false; + } + + std::vector<LLViewerObjectPtr> objects; + objects.push_back(object); + + std::string error; + derez_objects(DRD_SAVE_INTO_TASK_INVENTORY, source_task_id, first_region, error, &objects); + if (!error.empty()) + { + return false; + } + return true; +} + static void derez_objects_separate(EDeRezDestination dest, const LLUUID &dest_id) { std::vector<LLViewerObjectPtr> derez_object_list; @@ -5257,6 +5273,27 @@ void handle_link_objects() } } +void handle_unlink_objects() +{ + if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + LLPanel* visited_panel = LLFloaterSidePanelContainer::getPanel("places", "Teleport History"); + if (visited_panel && visited_panel->isInVisibleChain()) + { + LLFloaterReg::hideInstance("places"); + } + else + { + LLFloaterReg::toggleInstanceOrBringToFront("places"); + LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "open_teleport_history_tab")); + } + } + else + { + LLSelectMgr::getInstance()->unlinkObjects(); + } +} + // You can return an object to its owner if it is on your land. class LLObjectReturn : public view_listener_t { @@ -5784,10 +5821,13 @@ class LLToolsSaveToObjectInventory : public view_listener_t bool handleEvent(const LLSD& userdata) { LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); - if(node && (node->mValid) && (!node->mFromTaskID.isNull())) + if (node && node->mValid && !node->mFromTaskID.isNull()) { - // *TODO: check to see if the fromtaskid object exists. - derez_objects(DRD_SAVE_INTO_TASK_INVENTORY, node->mFromTaskID); + LLViewerObject* object = node->getObject(); + if (object) + { + save_object_back_to_contents(object, node->mFromTaskID); + } } return true; } @@ -5870,6 +5910,47 @@ class LLToolsCheckSelectionLODMode : public view_listener_t }; +class LLToolsCheckScriptEditorServer : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLScriptEditorWSServer::ptr_t server = LLScriptEditorWSServer::getServer(); + return server && server->isRunning(); + } +}; + +class LLToolsEnableScriptEditorServer : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + return LLScriptEditorWSServer::isEnabled(); + } +}; + +class LLToolsToggleScriptEditorServer : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLScriptEditorWSServer::ptr_t server = LLScriptEditorWSServer::getServer(); + if (server && server->isRunning()) + { + LLWebsocketMgr::instance().stopServer(LLScriptEditorWSServer::DEFAULT_SERVER_NAME); + } + else + { + if (LLScriptEditorWSServer::isTightIntegration()) + { + LLScriptEditorWSServer::launchVSCode(); + } + else + { + LLScriptEditorWSServer::ensureServerRunning(); + } + } + return true; + } +}; + // Round the position of all root objects to the grid class LLToolsSnapObjectXY : public view_listener_t { @@ -6825,7 +6906,7 @@ class LLAvatarTogglePicks : public view_listener_t instance->setFocus(true); LLAvatarActions::showPicks(gAgent.getID()); } - else if (picks_tab_visible()) + else if (LLAvatarActions::myPicksTabVisible()) { instance->closeFloater(); } @@ -8166,13 +8247,13 @@ class LLToolsSelectedScriptAction : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string action = userdata.asString(); - bool mono = false; + std::string target = "lsl2"; std::string msg, name; std::string title; if (action == "compile mono") { name = "compile_queue"; - mono = true; + target = "mono"; msg = "Recompile"; title = LLTrans::getString("CompileQueueTitle"); } @@ -8182,6 +8263,20 @@ class LLToolsSelectedScriptAction : public view_listener_t msg = "Recompile"; title = LLTrans::getString("CompileQueueTitle"); } + else if (action == "compile lua") + { + name = "compile_queue"; + target = "luau"; + msg = "Recompile"; + title = LLTrans::getString("CompileQueueTitle"); + } + else if (action == "compile lsl-luau") + { + name = "compile_queue"; + target = "lsl-luau"; + msg = "Recompile"; + title = LLTrans::getString("CompileQueueTitle"); + } else if (action == "reset") { name = "reset_queue"; @@ -8205,7 +8300,7 @@ class LLToolsSelectedScriptAction : public view_listener_t LLFloaterScriptQueue* queue =LLFloaterReg::getTypedInstance<LLFloaterScriptQueue>(name, LLSD(id)); if (queue) { - queue->setMono(mono); + queue->setCompileTarget(target); if (queue_actions(queue, msg)) { queue->setTitle(title); @@ -8604,6 +8699,27 @@ class LLEditableSelectedMono : public view_listener_t } }; +static bool is_lua_scripts_enabled() +{ + LLViewerRegion* region = gAgent.getRegion(); + if (!region || region->getCapability("UpdateScriptTask").empty() || !region->simulatorFeaturesReceived()) + { + return false; + } + + LLSD simulator_features; + region->getSimulatorFeatures(simulator_features); + return simulator_features["LuaScriptsEnabled"].asBoolean(); +} + +class LLEditableSelectedLua : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + return is_editable_selected() && is_lua_scripts_enabled(); + } +}; + bool enable_object_take_copy() { bool all_valid = false; @@ -8690,15 +8806,6 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t } }; -class LLToggleHowTo : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - LLFloaterReg::toggleInstanceOrBringToFront("guidebook"); - return true; - } -}; - class LLViewEnableMouselook : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -9836,6 +9943,16 @@ void handle_flush_name_caches() if (gCacheName) gCacheName->clear(); } +bool is_master_audio_muted() +{ + return LLAppViewer::instance()->getMasterSystemAudioMute(); +} + +void toggle_master_audio() +{ + LLAppViewer::instance()->setMasterSystemAudioMute(!is_master_audio_muted()); +} + class LLUploadCostCalculator : public view_listener_t { std::string mCostStr; @@ -9957,6 +10074,23 @@ void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y) LLMenuGL::showPopup(ctrl, show_topbarinfo_context_menu, x, y); } +static void register_agent_ui_callbacks() +{ + // These functions are used by menu and commands, they need to persist for the lifetime of the application + // Note: executes before LLToolBar::createButton and before menu builds + LLUICtrl::EnableCallbackRegistry::Registrar& global_enable = LLUICtrl::EnableCallbackRegistry::defaultRegistrar(); + LLUICtrl::CommitCallbackRegistry::Registrar& global_commit = LLUICtrl::CommitCallbackRegistry::defaultRegistrar(); + global_commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); + global_enable.add("Agent.enableFlyLand", boost::bind(&enable_fly_land)); + global_commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2)); + global_commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2)); + global_commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2)); + global_enable.add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2)); + global_enable.add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2)); + global_enable.add("Avatar.IsMyProfileOpen", boost::bind(&LLAvatarActions::myProfileVisible)); + global_enable.add("Avatar.IsPicksTabOpen", boost::bind(&LLAvatarActions::myPicksTabVisible)); +} + void initialize_edit_menu() { view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo"); @@ -10014,6 +10148,8 @@ void initialize_menus() bool mMult; }; + register_agent_ui_callbacks(); + LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar(); LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar(); @@ -10029,15 +10165,6 @@ void initialize_menus() enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed)); - // Agent - commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); - enable.add("Agent.enableFlyLand", boost::bind(&enable_fly_land)); - commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2)); - commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2)); - commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2)); - enable.add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2)); - enable.add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2)); - // File menu init_menu_file(); @@ -10110,6 +10237,8 @@ void initialize_menus() view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset"); view_listener_t::addMenu(new LLWorldCheckBanLines() , "World.CheckBanLines"); view_listener_t::addMenu(new LLWorldShowBanLines() , "World.ShowBanLines"); + commit.add("World.ToggleMasterAudio", boost::bind(&toggle_master_audio)); + enable.add("World.IsMasterAudioMuted", boost::bind(&is_master_audio_muted)); // Tools menu view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool"); @@ -10126,7 +10255,7 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid"); view_listener_t::addMenu(new LLToolsSelectNextPartFace(), "Tools.SelectNextPart"); commit.add("Tools.Link", boost::bind(&handle_link_objects)); - commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); + commit.add("Tools.Unlink", boost::bind(&handle_unlink_objects)); view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations"); view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys"); view_listener_t::addMenu(new LLToolsEnableReleaseKeys(), "Tools.EnableReleaseKeys"); @@ -10153,10 +10282,9 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsEnablePathfindingRebakeRegion(), "Tools.EnablePathfindingRebakeRegion"); view_listener_t::addMenu(new LLToolsCheckSelectionLODMode(), "Tools.ToolsCheckSelectionLODMode"); - // Help menu - // most items use the ShowFloater method - view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo"); - + view_listener_t::addMenu(new LLToolsCheckScriptEditorServer(), "Tools.CheckScriptEditorServer"); + view_listener_t::addMenu(new LLToolsEnableScriptEditorServer(), "Tools.EnableScriptEditorServer"); + view_listener_t::addMenu(new LLToolsToggleScriptEditorServer(), "Tools.ToggleScriptEditorServer"); // Advanced menu view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole"); view_listener_t::addMenu(new LLAdvancedCheckConsole(), "Advanced.CheckConsole"); @@ -10414,8 +10542,6 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarResetSkeletonAndAnimations(), "Avatar.ResetSkeletonAndAnimations"); view_listener_t::addMenu(new LLAvatarResetSelfSkeleton(), "Avatar.ResetSelfSkeleton"); view_listener_t::addMenu(new LLAvatarResetSelfSkeletonAndAnimations(), "Avatar.ResetSelfSkeletonAndAnimations"); - enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible)); - enable.add("Avatar.IsPicksTabOpen", boost::bind(&picks_tab_visible)); commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL"))); @@ -10537,5 +10663,6 @@ void initialize_menus() view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD"); view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected"); view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono"); + view_listener_t::addMenu(new LLEditableSelectedLua(), "EditableSelectedLua"); view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); } diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 6c9d56cffb..a0d47367f4 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -37,6 +37,7 @@ class LLView; class LLParcelSelection; class LLObjectSelection; class LLSelectNode; +class LLViewerObject; void initialize_edit_menu(); void initialize_spellcheck_menu(); @@ -75,6 +76,7 @@ void handle_take_copy(); void handle_look_at_selection(const LLSD& param); bool handle_zoom_to_object(const LLUUID& object_id); void handle_teleport_to_object(LLUUID object_id); +bool save_object_back_to_contents(LLViewerObject* object, const LLUUID& source_task_id); void handle_object_return(); void handle_object_delete(); void handle_object_edit(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 772abb0373..ce95d7363e 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -138,11 +138,11 @@ std::queue<LLFilePickerThread*> LLFilePickerThread::sDeadQ; void LLFilePickerThread::getFile() { -#if LL_WINDOWS +#if LL_DARWIN || LL_SDL_WINDOW + runModeless(); +#elif LL_WINDOWS // Todo: get rid of LLFilePickerThread and make this modeless start(); -#elif LL_DARWIN - runModeless(); #else run(); #endif @@ -335,7 +335,9 @@ void LLFilePickerReplyThread::startPicker(const file_picked_signal_t::slot_type void LLFilePickerReplyThread::startPicker(const file_picked_signal_t::slot_type & cb, LLFilePicker::ESaveFilter filter, const std::string & proposed_name, const file_picked_signal_t::slot_type & failure_cb) { - (new LLFilePickerReplyThread(cb, filter, proposed_name, failure_cb))->getFile(); + // Remove invalid characters + std::string sanitized_name = LLDir::getScrubbedFileName(proposed_name); + (new LLFilePickerReplyThread(cb, filter, sanitized_name, failure_cb))->getFile(); } void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames) @@ -1161,7 +1163,7 @@ void handle_compress_image() // so doing dirty, but OS independent fopen and fseek size_t get_file_size(std::string &filename) { - LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + LLFILE* file = LLFile::fopen(filename, LLFILE_MODE("rb")); /*Flawfinder: ignore*/ if (!file) { LL_WARNS() << "Error opening " << filename << LL_ENDL; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 26d40436e9..dde4897ab7 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -421,7 +421,26 @@ void send_complete_agent_movement(const LLHost& sim_host) msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->addU32Fast(_PREHASH_CircuitCode, msg->mOurCircuitCode); - msg->sendReliable(sim_host); + + // build a lambda to be used as callback on ACK or timeout + void (*complete_agent_movement_callback)(void**, S32) = [](void**, S32 result) + { + if(LLApp::isExiting()) return; + if (result != LL_ERR_NOERR) + { + LL_WARNS("Messaging") << "CompleteAgentMovement failed with err=" << result << LL_ENDL; + } + }; + + // We use same retry strategy as UseCircuitCode because this is a crucial message + // that MUST arrive else we'll suffer a failed login/teleport/region-cross + msg->sendReliable( + sim_host, + gSavedSettings.getS32("UseCircuitCodeMaxRetries"), + false, + (F32Seconds)gSavedSettings.getF32("UseCircuitCodeTimeout"), + complete_agent_movement_callback, + NULL); } void process_logout_reply(LLMessageSystem* msg, void**) @@ -2442,6 +2461,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) color.setVec(1.f,1.f,1.f,1.f); msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); + // Preserve tabs from scripts by expanding them to spaces before any sanitization/formatting. + LLStringUtil::replaceTabsWithSpaces(mesg, 4); bool ircstyle = false; @@ -3759,9 +3780,7 @@ void process_sound_trigger(LLMessageSystem *msg, void **) { if (!gAudiop) { -#if !LL_LINUX LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; -#endif return; } @@ -3833,9 +3852,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data) { if (!gAudiop) { -#if !LL_LINUX LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; -#endif return; } @@ -4184,11 +4201,12 @@ void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data) if (avatarp) { avatarp->processAvatarAppearance( mesgsys ); + return; } - else - { - LL_WARNS("Messaging") << "avatar_appearance sent for unknown avatar " << uuid << LL_ENDL; - } + // The avatar object doesn't exist yet. + // We will re-request its appearance data after it is created. + LLVOAvatar::registerEarlyAppearance(uuid); + LL_WARNS("Messaging") << "AvatarAppearance received for avatar " << uuid << " before object created" << LL_ENDL; } void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data) diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 8ec2a6d661..fb52d0a8e6 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -135,7 +135,8 @@ void LLGridManager::initialize(const std::string& grid_file) LLSD other_grids; llifstream llsd_xml; - if (!grid_file.empty()) + // grids.xml is not supplied by default + if (!grid_file.empty() && LLFile::isfile(grid_file)) { LL_INFOS("GridManager")<<"Grid configuration file '"<<grid_file<<"'"<<LL_ENDL; llsd_xml.open( grid_file.c_str(), std::ios::in | std::ios::binary ); diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 0937425a18..18c23cf7ff 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -57,13 +57,18 @@ protected: * This class maintains the currently selected grid, and provides short * form accessors for each of the properties of the selected grid. **/ -class LLGridManager : public LLSingleton<LLGridManager> +class LLGridManager : public LLSimpleton<LLGridManager> { +public: /// Instantiate the grid manager, load default grids, selects the default grid - LLSINGLETON(LLGridManager); + LLGridManager(); ~LLGridManager(); - public: + LLGridManager(const LLGridManager&) = delete; + LLGridManager(LLGridManager&&) = delete; + LLGridManager& operator=(const LLGridManager&) = delete; + LLGridManager& operator=(LLGridManager&&) = delete; + /* ================================================================ * @name Initialization and Configuration * @{ diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 7f51ad1065..382bdb0a93 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llviewerobject.h" +#include "llscripteditorws.h" #include "llaudioengine.h" #include "indra_constants.h" @@ -420,6 +421,13 @@ void LLViewerObject::markDead() LL_PROFILE_ZONE_SCOPED; //LL_INFOS() << "Marking self " << mLocalID << " as dead." << LL_ENDL; + // If this is a published root prim, notify the WS extension before teardown. + auto ws_server = LLScriptEditorWSServer::getServer(); + if (ws_server && ws_server->isObjectPublished(mID)) + { + ws_server->unpublishObject(mID, "deleted"); + } + // Root object of this hierarchy unlinks itself. if (getParent()) { @@ -744,6 +752,18 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list) } start = end+1; } + + if (auto ws_server = LLScriptEditorWSServer::getServer()) + { + LLNameValue* nv_name = getNVPair("Name"); + LLNameValue* nv_desc = getNVPair("Desc"); + if (nv_name || nv_desc) + { + std::string obj_name = nv_name ? nv_name->getString() : ""; + std::string obj_desc = nv_desc ? nv_desc->getString() : ""; + ws_server->onObjectPropertyChanged(mID, obj_name, obj_desc); + } + } } bool LLViewerObject::isAnySelected() const @@ -936,6 +956,24 @@ void LLViewerObject::addChild(LLViewerObject *childp) { mSeatCount++; } + else + { + if (auto ws_server = LLScriptEditorWSServer::getServer()) + { + // If the child was itself a published root, unpublish it — it is now a child prim + if (ws_server->isObjectPublished(childp->getID())) + { + ws_server->unpublishObject(childp->getID(), "linked"); + } + + // If our root is a published object, notify of the structural change + LLUUID root_id = getRootEdit()->getID(); + if (ws_server->isObjectPublished(root_id)) + { + ws_server->onLinksetChildAdded(root_id, childp); + } + } + } } } @@ -979,6 +1017,18 @@ void LLViewerObject::removeChild(LLViewerObject *childp) bool add_to_end = true; LLSelectMgr::getInstance()->selectObjectAndFamily(childp, add_to_end); } + + // Notify WS server of linkset structure change + if (!isDead() && !childp->isDead() && !childp->isAvatar()) + { + if (auto ws_server = LLScriptEditorWSServer::getServer()) + { + if (ws_server->isObjectPublished(getID())) + { + ws_server->onLinksetChildRemoved(getID(), childp->getID()); + } + } + } } void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects) @@ -2766,10 +2816,15 @@ void LLViewerObject::doUpdateInventory( // save a script, which involves removing the old one, and rezzing // in the new one. This method should be called with the asset id // of the new and old script AFTER the bytecode has been saved. -void LLViewerObject::saveScript( - const LLViewerInventoryItem* item, - bool active, - bool is_new) +// When creating a new script, the asset should be null. The server +// will create the new script based on the script_language (LSL or Lua) +// If a template_id is provided, the new script will be a copy of that item. +// +// *IMPORTANT* If template_id is provided, it must be the ITEM ID of a +// copy/mod-able script in the user's inventory. The simulator will verify +// permissions. +void LLViewerObject::saveScript(const LLViewerInventoryItem* item, + bool active, bool is_new, const LLUUID& template_id) { /* * XXXPAM Investigate not making this copy. Seems unecessary, but I'm unsure about the @@ -2798,12 +2853,104 @@ void LLViewerObject::saveScript( msg->addBOOLFast(_PREHASH_Enabled, enabled); msg->nextBlockFast(_PREHASH_InventoryBlock); task_item->packMessage(msg); + + // This is a completely new script (no asset id) and we've provided a template. + // Note that the script subtype on the template will override any subtype on the item. + if (task_item->getAssetUUID().isNull() && template_id.notNull()) + { + msg->nextBlock("NewScriptInfo"); + msg->addUUID("TemplateID", template_id); + } + msg->sendReliable(mRegionp->getHost()); // do the internal logic doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new); } +void LLViewerObject::createInventoryItem( + LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U8 sub_type, + const std::string& name, + const std::string& description, + const LLPermissions& permissions, + const LLSD& params, + std::function<void(bool, const LLSD&)> callback) +{ + if (!mRegionp) + { + if (callback) callback(false, LLSD().with("message", "No region")); + return; + } + + std::string cap_url = mRegionp->getCapability("CreateTaskInventoryItem"); + if (cap_url.empty()) + { + if (callback) callback(false, LLSD().with("message", "Capability not available")); + return; + } + + LLSD body; + body["object_id"] = mID; + body["inventory_type"] = (S32)inventory_type; + body["asset_type"] = (S32)asset_type; + body["sub_type"] = (S32)sub_type; + body["name"] = name; + body["description"] = description; + + LLSD perm_llsd; + perm_llsd["base"] = (S32)permissions.getMaskBase(); + perm_llsd["owner"] = (S32)permissions.getMaskOwner(); + perm_llsd["everyone"] = (S32)permissions.getMaskEveryone(); + perm_llsd["group"] = (S32)permissions.getMaskGroup(); + perm_llsd["next_owner"] = (S32)permissions.getMaskNextOwner(); + body["permissions"] = perm_llsd; + + if (params.isDefined()) + { + body["params"] = params; + } + + LLCoros::instance().launch("LLViewerObject::createInventoryItemCoro", + boost::bind(&LLViewerObject::createInventoryItemCoro, cap_url, body, callback)); +} + +// static +void LLViewerObject::createInventoryItemCoro( + const std::string cap_url, const LLSD body, + std::function<void(bool, const LLSD&)> callback) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("CreateTaskInventoryItem", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + + LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, body); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + bool success = static_cast<bool>(status) && result["success"].asBoolean(); + + if (success) + { + LLUUID object_id = body["object_id"].asUUID(); + LLViewerObject* obj = gObjectList.findObject(object_id); + if (obj) + { + ++obj->mExpectedInventorySerialNum; + obj->dirtyInventory(); + obj->requestInventory(); + } + } + + if (callback) + { + callback(success, result); + } +} + void LLViewerObject::moveInventory(const LLUUID& folder_id, const LLUUID& item_id) { @@ -4035,6 +4182,11 @@ U32 LLViewerObject::getTriangleCount(S32* vcount) const return 0; } +U32 LLViewerObject::getLODTriangleCount(S32 lod) +{ + return 0; +} + U32 LLViewerObject::getHighLODTriangleCount() { return 0; @@ -4056,6 +4208,27 @@ U32 LLViewerObject::recursiveGetTriangleCount(S32* vcount) const return total_tris; } +void LLViewerObject::recursiveGetLODTriangleCount(S32& high_lod, S32& medium_lod, S32& low_lod, S32& lowest_lod) +{ + high_lod = (S32)getLODTriangleCount(LLModel::LOD_HIGH); + medium_lod = (S32)getLODTriangleCount(LLModel::LOD_MEDIUM); + low_lod = (S32)getLODTriangleCount(LLModel::LOD_LOW); + lowest_lod = (S32)getLODTriangleCount(LLModel::LOD_IMPOSTOR); + LLViewerObject::const_child_list_t& child_list = getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* childp = *iter; + if (childp) + { + high_lod += (S32)childp->getLODTriangleCount(LLModel::LOD_HIGH); + medium_lod += (S32)childp->getLODTriangleCount(LLModel::LOD_MEDIUM); + low_lod += (S32)childp->getLODTriangleCount(LLModel::LOD_LOW); + lowest_lod += (S32)childp->getLODTriangleCount(LLModel::LOD_IMPOSTOR); + } + } +} + // This is using the stored surface area for each volume (which // defaults to 1.0 for the case of everything except a sculpt) and // then scaling it linearly based on the largest dimension in the diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 8f23563c28..81ce014133 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -25,8 +25,7 @@ * $/LicenseInfo$ */ -#ifndef LL_LLVIEWEROBJECT_H -#define LL_LLVIEWEROBJECT_H +#pragma once #include <map> #include <unordered_map> @@ -427,10 +426,12 @@ public: virtual F32 getStreamingCost() const; virtual bool getCostData(LLMeshCostData& costs) const; virtual U32 getTriangleCount(S32* vcount = NULL) const; + virtual U32 getLODTriangleCount(S32 lod); virtual U32 getHighLODTriangleCount(); F32 recursiveGetScaledSurfaceArea() const; U32 recursiveGetTriangleCount(S32* vcount = NULL) const; + void recursiveGetLODTriangleCount(S32 &high_lod, S32 &medium_lod, S32 &low_lod, S32 &lowest_lod); void setObjectCost(F32 cost); F32 getObjectCost(); @@ -549,7 +550,20 @@ public: // save a script, which involves removing the old one, and rezzing // in the new one. This method should be called with the asset id // of the new and old script AFTER the bytecode has been saved. - void saveScript(const LLViewerInventoryItem* item, bool active, bool is_new); + // The simulator treats the script as new when item->getAssetUUID().isNull() is true; in that case + // template_id will be used (if non-null) to copy an existing script asset, otherwise the + // script subtype in the item will be used to select the correct template. + void saveScript(const LLViewerInventoryItem* item, bool active, bool is_new, const LLUUID& template_id); + + void createInventoryItem( + LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U8 sub_type, + const std::string& name, + const std::string& description, + const LLPermissions& permissions, + const LLSD& params, + std::function<void(bool, const LLSD&)> callback); // move an inventory item out of the task and into agent // inventory. This operation is based on messaging. No permissions @@ -731,6 +745,8 @@ private: void fetchInventoryDelayed(const F64 &time_seconds); static void fetchInventoryDelayedCoro(const LLUUID task_inv, const F64 time_seconds); static void fetchInventoryFromCapCoro(const LLUUID task_inv); + static void createInventoryItemCoro(const std::string cap_url, const LLSD body, + std::function<void(bool, const LLSD&)> callback); public: // @@ -1112,5 +1128,3 @@ public: virtual void updateDrawable(bool force_damped); }; - -#endif diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index caabd66780..48b8a8da59 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -386,7 +386,7 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry* objectp->setLastUpdateType(OUT_FULL_COMPRESSED); //newly cached objectp->setLastUpdateCached(true); } - LLVOAvatar::cullAvatarsByPixelArea(); + LLVOAvatar::setCullNeedsUpdate(); return objectp; } @@ -683,7 +683,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, objectp->setLastUpdateType(update_type); } - LLVOAvatar::cullAvatarsByPixelArea(); + LLVOAvatar::setCullNeedsUpdate(); } void LLViewerObjectList::processCompressedObjectUpdate(LLMessageSystem *mesgsys, @@ -1379,6 +1379,7 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp) void LLViewerObjectList::killAllObjects() { + LL_PROFILE_ZONE_SCOPED; // Used only on global destruction. // Mass cleanup to not clear lists one item at a time @@ -1401,7 +1402,10 @@ void LLViewerObjectList::killAllObjects() gMeshRepo.unregisterAllMeshes(); - cleanDeadObjects(false); + // Direct clear instead of cleanDeadObjects - all objects are already dead + mObjects.clear(); + mDeadObjects.clear(); + mNumDeadObjects = 0; if(!mObjects.empty()) { diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h index adfe709b04..fb6fa8bac4 100644 --- a/indra/newview/llvieweroctree.h +++ b/indra/newview/llvieweroctree.h @@ -70,8 +70,7 @@ S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVect S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared); //defines data needed for octree of an entry -//LL_ALIGN_PREFIX(16) -class LLViewerOctreeEntry : public LLRefCount +class alignas(16) LLViewerOctreeEntry : public LLRefCount { LL_ALIGN_NEW friend class LLViewerOctreeEntryData; @@ -115,16 +114,15 @@ private: LLViewerOctreeGroup* mGroup; //aligned members - LL_ALIGN_16(LLVector4a mExtents[2]); - LL_ALIGN_16(LLVector4a mPositionGroup); + LLVector4a mExtents[2]; + LLVector4a mPositionGroup; F32 mBinRadius; mutable S32 mBinIndex; mutable U32 mVisible; -} ;//LL_ALIGN_POSTFIX(16); +}; //defines an abstract class for entry data -//LL_ALIGN_PREFIX(16) class LLViewerOctreeEntryData : public LLRefCount { protected: @@ -173,11 +171,10 @@ protected: LLPointer<LLViewerOctreeEntry> mEntry; LLViewerOctreeEntry::eEntryDataType_t mDataType; static U32 sCurVisible; // Counter for what value of mVisible means currently visible -};//LL_ALIGN_POSTFIX(16); +}; //defines an octree group for an octree node, which contains multiple entries. -//LL_ALIGN_PREFIX(16) class LLViewerOctreeGroup : public OctreeListener { @@ -259,18 +256,17 @@ protected: U32 mState; OctreeNode* mOctreeNode; - LL_ALIGN_16(LLVector4a mBounds[2]); // bounding box (center, size) of this node and all its children (tight fit to objects) - LL_ALIGN_16(LLVector4a mObjectBounds[2]); // bounding box (center, size) of objects in this node - LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children - LL_ALIGN_16(LLVector4a mObjectExtents[2]); // extents (min, max) of objects in this node + LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects) + LLVector4a mObjectBounds[2]; // bounding box (center, size) of objects in this node + LLVector4a mExtents[2]; // extents (min, max) of this node and all its children + LLVector4a mObjectExtents[2]; // extents (min, max) of objects in this node S32 mAnyVisible; //latest visible to any camera S32 mVisible[LLViewerCamera::NUM_CAMERAS]; -};//LL_ALIGN_POSTFIX(16); +}; //octree group which has capability to support occlusion culling -//LL_ALIGN_PREFIX(16) class LLOcclusionCullingGroup : public LLViewerOctreeGroup { public: @@ -339,7 +335,7 @@ protected: public: static std::set<U32> sPendingQueries; -};//LL_ALIGN_POSTFIX(16); +}; class LLViewerOctreePartition { diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index b794047135..63eb08e4ae 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -309,6 +309,14 @@ void LLViewerParcelMgr::resetSegments(U8* segments) void LLViewerParcelMgr::writeHighlightSegments(F32 west, F32 south, F32 east, F32 north) { + if (west < 0 || south < 0 || east < 0 || north < 0) + { + LL_WARNS() << "Invalid parcel edge coordinates provided to writeHighlightSegments- " + << "west: " << west << ", south: " << south << ", east: " << east << ", north: " << north + << LL_ENDL; + return; + } + S32 x, y; S32 min_x = ll_round( west / PARCEL_GRID_STEP_METERS ); S32 max_x = ll_round( east / PARCEL_GRID_STEP_METERS ); diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 0bb03cdd60..6296ec74cc 100755..100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -809,7 +809,7 @@ void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_me const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - //glLineWidth(1.0f); + //gGL.setLineWidth(1.0f); gGL.color4fv(parcel_outline_color); for (S32 i = 0; i <= GRIDS_PER_EDGE; i++) { diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index dd02cca50a..c37daa53a3 100755..100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1891,8 +1891,17 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry) } else { - LLViewerRegion* old_regionp = ((LLDrawable*)entry->getEntry()->getDrawable())->getRegion(); - if(old_regionp != this) + LLDrawable* drawablep = (LLDrawable*)entry->getEntry()->getDrawable(); + if (!drawablep || drawablep->isDead() || drawablep->getVObj().isNull()) + { + LL_WARNS() << "Entry: " << entry->getLocalID() << " has a dead or invalid drawable; resetting to inactive." << LL_ENDL; + mImpl->mVisibleEntries.erase(entry); + entry->setState(LLVOCacheEntry::INACTIVE); + return NULL; + } + + LLViewerRegion* old_regionp = drawablep->getRegion(); + if (old_regionp != this) { //this object exists in two regions at the same time; //this case can be safely ignored here because @@ -3207,7 +3216,26 @@ void LLViewerRegion::unpackRegionHandshake() flags |= 0x00000002; //set the bit 1 to be 1 to tell sim the cache file is empty, no need to send cache probes. } msg->addU32("Flags", flags ); - msg->sendReliable(host); + + // build a lambda to be used as callback on ACK or timeout + void (*region_handshake_reply_callback)(void**, S32) = [](void**, S32 result) + { + if(LLApp::isExiting()) return; + if (result != LL_ERR_NOERR) + { + LL_WARNS("Messaging") << "RegionHandshakeReply failed with err=" << result << LL_ENDL; + } + }; + + // This is a crucial message for establishing a connection to a region + // (either the main region or a visible neighbor). + msg->sendReliable( + host, + gSavedSettings.getS32("UseCircuitCodeMaxRetries"), + false, + (F32Seconds)gSavedSettings.getF32("UseCircuitCodeTimeout"), + region_handshake_reply_callback, + NULL); mRegionTimer.reset(); //reset region timer. } @@ -3243,6 +3271,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("FetchInventory2"); capabilityNames.append("FetchInventoryDescendents2"); capabilityNames.append("IncrementCOFVersion"); + capabilityNames.append("CreateTaskInventoryItem"); capabilityNames.append("RequestTaskInventory"); AISAPI::getCapNames(capabilityNames); @@ -3296,6 +3325,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("RequestTextureDownload"); capabilityNames.append("ResourceCostSelected"); capabilityNames.append("RetrieveNavMeshSrc"); + capabilityNames.append("ScriptDefinitions"); capabilityNames.append("SearchStatRequest"); capabilityNames.append("SearchStatTracking"); capabilityNames.append("SendPostcard"); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index eea0b37c43..b537f6eba8 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -128,7 +128,6 @@ LLGLSLShader gPathfindingNoNormalsProgram; //avatar shader handles LLGLSLShader gAvatarProgram; -LLGLSLShader gAvatarEyeballProgram; LLGLSLShader gImpostorProgram; // Effects Shaders @@ -418,7 +417,6 @@ void LLViewerShaderMgr::finalizeShaderList() //ONLY shaders that need WL Param management should be added here mShaderList.push_back(&gAvatarProgram); mShaderList.push_back(&gWaterProgram); - mShaderList.push_back(&gAvatarEyeballProgram); mShaderList.push_back(&gImpostorProgram); mShaderList.push_back(&gObjectBumpProgram); mShaderList.push_back(&gObjectFullbrightAlphaMaskProgram); @@ -588,6 +586,7 @@ void LLViewerShaderMgr::setShaders() LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow"); LLPipeline::RenderAvatarCloth = gSavedSettings.getBOOL("RenderAvatarCloth"); + LLPipeline::sRenderTransparentWater = gSavedSettings.getBOOL("RenderTransparentWater"); if (gViewerWindow) { @@ -705,7 +704,7 @@ void LLViewerShaderMgr::setShaders() if (loadShadersObject()) { //hardware skinning is enabled and rigged attachment shaders loaded correctly // cloth is a class3 shader - S32 avatar_class = 1; + constexpr S32 avatar_class = 1; // Set the actual level mShaderLevel[SHADER_AVATAR] = avatar_class; @@ -714,8 +713,11 @@ void LLViewerShaderMgr::setShaders() llassert(loaded); } else - { //hardware skinning not possible, neither is deferred rendering - llassert(false); // SHOULD NOT BE POSSIBLE + { + // SHOULD NOT BE POSSIBLE + // Hardware skinning not possible, neither is deferred rendering + // but both are a hard requirement, viewer will crash without them + LL_ERRS() << "Failed to load object shaders, cannot continue." << LL_ENDL; } } @@ -1011,7 +1013,10 @@ bool LLViewerShaderMgr::loadShadersWater() return loadShadersWater(); } - LLWorld::getInstance()->updateWaterObjects(); + if (LLWorld::instanceExists()) + { + LLWorld::getInstance()->updateWaterObjects(); + } return true; } @@ -3176,14 +3181,6 @@ bool LLViewerShaderMgr::loadShadersAvatar() LL_PROFILE_ZONE_SCOPED; #if 1 // DEPRECATED -- forward rendering is deprecated bool success = true; - - if (mShaderLevel[SHADER_AVATAR] == 0) - { - gAvatarProgram.unload(); - gAvatarEyeballProgram.unload(); - return true; - } - if (success) { gAvatarProgram.mName = "Avatar Shader"; @@ -3207,27 +3204,13 @@ bool LLViewerShaderMgr::loadShadersAvatar() } } - if (success) - { - gAvatarEyeballProgram.mName = "Avatar Eyeball Program"; - gAvatarEyeballProgram.mFeatures.calculatesLighting = true; - gAvatarEyeballProgram.mFeatures.isSpecular = true; - gAvatarEyeballProgram.mFeatures.calculatesAtmospherics = true; - gAvatarEyeballProgram.mFeatures.hasGamma = true; - gAvatarEyeballProgram.mFeatures.hasAtmospherics = true; - gAvatarEyeballProgram.mFeatures.hasLighting = true; - gAvatarEyeballProgram.mFeatures.hasAlphaMask = true; - gAvatarEyeballProgram.mShaderFiles.clear(); - gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER)); - gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER)); - gAvatarEyeballProgram.mShaderLevel = mShaderLevel[SHADER_AVATAR]; - success = gAvatarEyeballProgram.createShader(); - } - if( !success ) { + // This isn't supposed to fail, otherwise defferred shaders would have failed. + // Is only used for avatar previews (like LLVisualParamHint) mShaderLevel[SHADER_AVATAR] = 0; mMaxAvatarShaderLevel = 0; + LL_WARNS() << "Failed to create avatar shader!" << LL_ENDL; return false; } #endif diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f503401510..42a490c8e7 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -208,7 +208,6 @@ extern LLGLSLShader gPathfindingNoNormalsProgram; // avatar shader handles extern LLGLSLShader gAvatarProgram; -extern LLGLSLShader gAvatarEyeballProgram; extern LLGLSLShader gImpostorProgram; // Post Process Shaders diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index f84c2b8530..ab684833ed 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -716,6 +716,8 @@ void send_viewer_stats(bool include_preferences) system["os"] = LLOSInfo::instance().getOSStringSimple(); system["cpu"] = gSysCPU.getCPUString(); system["cpu_sse"] = gSysCPU.getSSEVersions(); + system["cpu_simd"] = gSysCPU.getSIMDVersions(); + system["cpu_mhz"] = gSysCPU.getMHz(); system["address_size"] = ADDRESS_SIZE; system["os_bitness"] = LLOSInfo::instance().getOSBitness(); system["hardware_concurrency"] = (LLSD::Integer) std::thread::hardware_concurrency(); @@ -738,6 +740,19 @@ void send_viewer_stats(bool include_preferences) system["gpu_vendor"] = gGLManager.mGLVendorShort; system["gpu_version"] = gGLManager.mDriverVersionVendorString; system["opengl_version"] = gGLManager.mGLVersionString; + system["gpu_vram_mb"] = (S32)gGLManager.mVRAM; + system["glsl_version"] = llformat("%d.%d", gGLManager.mGLSLVersionMajor, gGLManager.mGLSLVersionMinor); + + // Resource usage + // getAvailableMemKB might be a bit stale, but that's fine, this is statistics, + // not a debug tool. + // TODO: 26.3 branch introduced getAvailableCommitMemMB, use that on windows + system["ram_avail_mb"] = (S32Megabytes)(LLMemory::getAvailableMemKB()).value(); + system["ram_allocated_mb"] = (S32Megabytes)(LLMemory::getAllocatedMemKB()).value(); + static constexpr F64 BYTES_TO_MB = 1024.0 * 1024.0; + F64 texture_bytes_alloc = LLImageGL::getTextureBytesAllocated() / BYTES_TO_MB; + F64 vertex_bytes_alloc = LLVertexBuffer::getBytesAllocated() / BYTES_TO_MB; + system["gpu_vram_tracked_mb"] = (F32)(texture_bytes_alloc + vertex_bytes_alloc); gGLManager.asLLSD(system["gl"]); @@ -793,7 +808,7 @@ void send_viewer_stats(bool include_preferences) LLSD &fail = body["stats"]["failures"]; fail["send_packet"] = (S32) gMessageSystem->mSendPacketFailureCount; - fail["dropped"] = (S32) gMessageSystem->mDroppedPackets; + fail["dropped"] = (S32) gMessageSystem->getTotalNumDroppedPackets(); fail["resent"] = (S32) gMessageSystem->mResentPackets; fail["failed_resends"] = (S32) gMessageSystem->mFailedResendPackets; fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets; diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 3e0e3b28f2..b909421a37 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -194,7 +194,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) // Open the data file makeStatsFileName(); - mStatsFile = LLFile::fopen(mStatsFileName, "wb"); + mStatsFile = LLFile::fopen(mStatsFileName, LLFILE_MODE("wb")); if (mStatsFile) { diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 95e34b4df1..a58d7546ce 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -249,6 +249,25 @@ public: /*virtual*/ bool canEdit() const { return false; } + /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask) + { + bool show_menu = !mEditor.hasSelection() + || (mEditor.mSelectionStart == mStart && mEditor.mSelectionEnd == mStart + 1); + if (show_menu && mEditor.getShowContextMenu()) + { + // User clicked an item, user expects the menu to be + // in 'context' for the item. Change selection to match. + // Todo: Might be better to 'smartly' deselect here + // and to have an object specific menu. + mEditor.setCursorPos(mStart + 1); + mEditor.mSelectionStart = mStart; + mEditor.mSelectionEnd = mStart + 1; + + mEditor.showContextMenu(x, y); + return true; + } + return false; + } /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask) { diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index e77c14a53d..cc5337d0e1 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1622,6 +1622,7 @@ void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void ** // guaranteed. void LLUIImageList::cleanUp() { + LLUIImage::cleanupClass(); mUIImages.clear(); mUITextureList.clear() ; } diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp index 3ccfbea6e2..90a60c7a94 100644 --- a/indra/newview/llviewerthrottle.cpp +++ b/indra/newview/llviewerthrottle.cpp @@ -45,8 +45,8 @@ using namespace LLOldEvents; const F32 MAX_FRACTIONAL = 1.5f; const F32 MIN_FRACTIONAL = 0.2f; -const F32 MIN_BANDWIDTH = 50.f; -const F32 MAX_BANDWIDTH = 6000.f; +const F32 MIN_BANDWIDTH = 50.f; // Kbps +const F32 MAX_BANDWIDTH = 6000.f; // Kbps const F32 STEP_FRACTIONAL = 0.1f; const F32 HIGH_BUFFER_LOAD_TRESHOLD = 1.f; const F32 LOW_BUFFER_LOAD_TRESHOLD = 0.8f; @@ -244,6 +244,8 @@ void LLViewerThrottle::sendToSim() const F32 LLViewerThrottle::getMaxBandwidthKbps() { + // Why are thse different than the constants with the same names higher up? + // Anybody know? -- Leviathan constexpr F32 MIN_BANDWIDTH = 100.0f; // 100 Kbps constexpr F32 MAX_BANDWIDTH = 10000.0f; // 10 Mbps @@ -309,6 +311,21 @@ void LLViewerThrottle::resetDynamicThrottle() void LLViewerThrottle::updateDynamicThrottle() { + // User configurable bandwidth settings are merely vague aspirations. Translating those + // to what should be sent to the servers is complicated. Servers will tend to spike data + // transmission upon arrival, packets will arrive faster than we can process them, and this + // can overflow the buffer, which causes packet loss. + // + // In an attempt to avoid catastrophe we periodically measure buffer load and packet loss + // and then transmit a modified desired bandwidth to the server. Unfortunately, this system + // does not work well for spikey data bursts because: + // (1) the response takes too long (up to 5 seconds) to kick in + // (2) once it starts it tends to ramp up too slowly + // (3) it doesn't know which region is providing the flood; it just assumes it is + // all from the main region + // + // TODO: fix those ^^^ problems + if (mUpdateTimer.getElapsedTimeF32() < DYNAMIC_UPDATE_DURATION) { return; @@ -347,5 +364,7 @@ void LLViewerThrottle::updateDynamicThrottle() LL_INFOS() << "Easing network throttle to " << mCurrentBandwidth << LL_ENDL; } + // Now that we've used mBufferLoadRate we reset it to zero because otherwise it only + // increases (see clamping behavior in setBufferLoadRate()). mBufferLoadRate = 0; } diff --git a/indra/newview/llviewerthrottle.h b/indra/newview/llviewerthrottle.h index ef898a97d7..7ff0a7d1f0 100644 --- a/indra/newview/llviewerthrottle.h +++ b/indra/newview/llviewerthrottle.h @@ -77,8 +77,8 @@ public: static const std::string sNames[TC_EOF]; protected: - F32 mMaxBandwidth; - F32 mCurrentBandwidth; + F32 mMaxBandwidth; // bps + F32 mCurrentBandwidth; // bps F32 mBufferLoadRate = 0; LLViewerThrottleGroup mCurrent; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 488b551e36..6729e20420 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -33,11 +33,10 @@ #include <iostream> #include <fstream> #include <algorithm> -#include <boost/filesystem.hpp> -#include <boost/regex.hpp> #include "llagent.h" #include "llagentcamera.h" +#include "llcallbacklist.h" #include "llcommandhandler.h" #include "llcommunicationchannel.h" #include "llfloaterreg.h" @@ -188,7 +187,6 @@ #include "llviewerjoystick.h" #include "llviewermenufile.h" // LLFilePickerReplyThread #include "llviewernetwork.h" -#include "llpostprocess.h" #include "llfloaterimnearbychat.h" #include "llagentui.h" #include "llwearablelist.h" @@ -782,14 +780,14 @@ public: addText(xpos, ypos, "Projection Matrix"); ypos += y_inc; -#if LL_DARWIN +#if LL_CLANG // 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 +#if LL_CLANG #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; @@ -1467,12 +1465,68 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window) LLToolTipMgr::instance().blockToolTips(); } +void LLViewerWindow::handlePreCloseRequest() +{ + // WINDOW THREAD! since we need this to act fast. + if (!LLApp::isExiting() && !LLApp::isStopped()) + { + LLAppViewer::instance()->createCloseRequestMarker(); + } +} + +void LLViewerWindow::handleCloseRequestCanceled() +{ + // WINDOW THREAD! since we need this to act fast. + if (!LLApp::isExiting() && !LLApp::isStopped()) + { + LLAppViewer::instance()->removeCloseRequestMarker(); + } +} + +void LLViewerWindow::handleSuspendRequest() +{ + static LLCachedControl<S32> os_hibernation_mode(gSavedSettings, "OSHibernationMode", 0); + if (os_hibernation_mode == 0) + { + LL_INFOS() << "Got a 'suspend' event from OS" << LL_ENDL; + // Viewer doesn't handle hibernation. + // Just send statistics. + LLAppViewer::instance()->sendViewerStatistics(false); + } + else + { + LL_INFOS() << "Got a 'suspend' event from OS, disconnecting" << LL_ENDL; + // Viewer is set to prevent hibernation if agent isn't away. + // If we got here, likely Agent 'went' away then viewer got + // a hibernation message. + // We have a limited timeframe. Sends stats then disconnect. + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + LLAppViewer::instance()->sendViewerStatistics(true); + LLAppViewer::instance()->metricsSend(!gDisconnected); + // Make sure to show a message. + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("YouHaveBeenDisconnected")); + } + } +} + bool LLViewerWindow::handleCloseRequest(LLWindow *window, bool from_user) { if (!LLApp::isExiting() && !LLApp::isStopped()) { if (from_user) { + // Task naamger kills viewer after 1 second, 3 seconds + // is overkill, but decided to be on a safe side. + doAfterInterval([]() + { + // if user quits, marker will be cleaned by cleanup, + // if user cancels quit, marker will be cleaned here, + // but if task manager kills us, marker stays. + LLAppViewer::instance()->removeCloseRequestMarker(); + }, 3.0f); + // User has indicated they want to close, but we may need to ask // about modified documents. LLAppViewer::instance()->userQuit(); @@ -1493,6 +1547,9 @@ bool LLViewerWindow::handleSessionExit(LLWindow* window) { // Viewer received WM_ENDSESSION and app will be killed soon if it doesn't respond LLAppViewer* app = LLAppViewer::instance(); + // Normally we'd include preferences, but serializing them can be expensive. + // There is also a chance this won't be processed if the logout request arrives first. + app->sendViewerStatistics(false /*no preferences*/); app->sendSimpleLogoutRequest(); app->earlyExitNoNotify(); @@ -1903,7 +1960,7 @@ LLViewerWindow::LLViewerWindow(const Params& p) LLNotifications::instance().setIgnoreAllNotifications(ignore); if (ignore) { - LL_INFOS() << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << LL_ENDL; + LL_INFOS("Window") << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << LL_ENDL; } @@ -1941,13 +1998,8 @@ LLViewerWindow::LLViewerWindow(const Params& p) ms_sleep(5000) ; //wait for 5 seconds. LLSplashScreen::update(LLTrans::getString("ShuttingDown")); -#if LL_LINUX - LL_WARNS() << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt for further information." - << LL_ENDL; -#else LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" << LL_ENDL; -#endif LLAppViewer::instance()->fastQuit(1); } else if (!LLViewerShaderMgr::sInitialized) @@ -1976,6 +2028,23 @@ LLViewerWindow::LLViewerWindow(const Params& p) gSavedSettings.setF32("UIScaleFactor", 1.f); } gSavedSettings.setBOOL("ResetUIScaleOnFirstRun", false); + LL_DEBUGS("Window") << "ResetUIScaleOnFirstRun fired:" + << " system_ui_size=" << mWindow->getSystemUISize() + << " UIScaleFactor_after_reset=" << gSavedSettings.getF32("UIScaleFactor") + << " screen_size=" << scr.mX << "x" << scr.mY + << " pixel_aspect_ratio=" << mWindow->getPixelAspectRatio() + << " ResetUIScaleOnFirstRun=" << gSavedSettings.getBOOL("ResetUIScaleOnFirstRun") + << LL_ENDL; + } + else + { + LL_DEBUGS("Window") << "Display init diagnostics:" + << " screen_size=" << scr.mX << "x" << scr.mY + << " system_ui_size=" << mWindow->getSystemUISize() + << " pixel_aspect_ratio=" << mWindow->getPixelAspectRatio() + << " saved_UIScaleFactor=" << gSavedSettings.getF32("UIScaleFactor") + << " ResetUIScaleOnFirstRun=" << gSavedSettings.getBOOL("ResetUIScaleOnFirstRun") + << LL_ENDL; } // Get the real window rect the window was created with (since there are various OS-dependent reasons why @@ -1984,6 +2053,12 @@ LLViewerWindow::LLViewerWindow(const Params& p) mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f)); mDisplayScale *= ui_scale_factor; + LL_DEBUGS("Window") << "Display scale computed:" + << " ui_scale_factor=" << ui_scale_factor + << " mDisplayScale=" << mDisplayScale + << " (clamped_to=[" << MIN_UI_SCALE << ", " << MAX_UI_SCALE << "])" + << LL_ENDL; + LLUI::setScaleFactor(mDisplayScale); LLFontGL::sResolutionGeneration++; @@ -3071,7 +3146,7 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask) { if ((focusedFloaterName == "nearby_chat") || (focusedFloaterName == "im_container") || (focusedFloaterName == "impanel")) { - LLCachedControl<bool> key_move(gSavedSettings, "ArrowKeysAlwaysMove"); + static LLCachedControl<bool> key_move(gSavedSettings, "ArrowKeysAlwaysMove"); if (key_move()) { // let Control-Up and Control-Down through for chat line history, @@ -3930,7 +4005,7 @@ void LLViewerWindow::updateLayout() void LLViewerWindow::updateMouseDelta() { -#if LL_WINDOWS && !LL_SDL +#if LL_WINDOWS && !LL_SDL_WINDOW LLCoordCommon delta; mWindow->getCursorDelta(&delta); S32 dx = delta.mX; @@ -4859,14 +4934,10 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save return; } -// Check if there is enough free space to save snapshot -#ifdef LL_WINDOWS - boost::filesystem::path b_path(ll_convert<std::wstring>(lastSnapshotDir)); -#else - boost::filesystem::path b_path(lastSnapshotDir); -#endif - boost::system::error_code ec; - if (!boost::filesystem::is_directory(b_path, ec) || ec.failed()) + // Check if there is enough free space to save snapshot + std::filesystem::path b_path = fsyspath(lastSnapshotDir); + std::error_code ec; + if (!std::filesystem::is_directory(b_path, ec) || ec) { LLSD args; args["PATH"] = lastSnapshotDir; @@ -4875,8 +4946,8 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save failure_cb(); return; } - boost::filesystem::space_info b_space = boost::filesystem::space(b_path, ec); - if (ec.failed()) + std::filesystem::space_info b_space = std::filesystem::space(b_path, ec); + if (ec) { LLSD args; args["PATH"] = lastSnapshotDir; @@ -5685,11 +5756,6 @@ void* LLViewerWindow::getPlatformWindow() const return mWindow->getPlatformWindow(); } -void* LLViewerWindow::getMediaWindow() const -{ - return mWindow->getMediaWindow(); -} - void LLViewerWindow::focusClient() const { return mWindow->focusClient(); @@ -5911,11 +5977,6 @@ void LLViewerWindow::stopGL() gBox.cleanupGL(); - if(gPostProcess) - { - gPostProcess->invalidate(); - } - gTextureList.destroyGL(); stop_glerror(); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index c748f051dd..06d49df56d 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -203,6 +203,9 @@ 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*/ void handlePreCloseRequest(); + /*virtual*/ void handleCloseRequestCanceled(); + /*virtual*/ void handleSuspendRequest(); /*virtual*/ bool handleCloseRequest(LLWindow *window, bool from_user); /*virtual*/ bool handleSessionExit(LLWindow* window); /*virtual*/ void handleQuit(LLWindow *window); @@ -277,7 +280,6 @@ public: LLWindow* getWindow() const { return mWindow; } void* getPlatformWindow() const; - void* getMediaWindow() const; void focusClient() const; LLCoordGL getLastMouse() const { return mLastMousePoint; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4d15126271..f4226df5f7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -602,6 +602,8 @@ bool LLVOAvatar::sLimitNonImpostors = false; // True unless RenderAvatarMaxNonIm F32 LLVOAvatar::sRenderDistance = 256.f; S32 LLVOAvatar::sNumVisibleAvatars = 0; S32 LLVOAvatar::sNumLODChangesThisFrame = 0; +bool LLVOAvatar::sAvatarCullNeedsUpdate = true; +F64 LLVOAvatar::sLastCullUpdateTime = 0.0; const LLUUID LLVOAvatar::sStepSoundOnLand("e8af4a28-aa83-4310-a7c4-c047e15ea0df"); const LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] = @@ -615,6 +617,8 @@ const LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] = SND_RUBBER_RUBBER }; +uuid_list_t LLVOAvatar::sEarlyAppearanceList; + S32 LLVOAvatar::sRenderName = RENDER_NAME_ALWAYS; S32 LLVOAvatar::sRenderGroupTitles = RENDER_GROUP_TITLE_ALWAYS; S32 LLVOAvatar::sNumVisibleChatBubbles = 0; @@ -701,7 +705,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN), mLoadedCallbacksPaused(false), mLoadedCallbackTextures(0), - mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)), mLastRezzedStatus(-1), mIsEditingAppearance(false), mUseLocalAppearance(false), @@ -783,6 +786,21 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mVisuallyMuteSetting = LLVOAvatar::VisualMuteSettings(LLRenderMuteList::getInstance()->getSavedVisualMuteSetting(getID())); sInstances.push_back(this); + + uuid_list_t::iterator it = sEarlyAppearanceList.find(id); + if (it != sEarlyAppearanceList.end()) + { + // Note: aside from LLVOAvatar::resetEarlyAppearanceList() (called on + // teleport), this is the only place where we remove from + // sEarlyAppearanceList, which means any agent who receives an + // AvatarAppearance message but is never actually instantiated will + // remain on the list until the next teleport. This is a resource leak + // but we expect it to be small enough per-session to not cause problems. + sEarlyAppearanceList.erase(it); + LL_INFOS("Avatar") << "Re-requesting AvatarAppearance for new avatar " << id << LL_ENDL; + LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); + } + sOverrideAnimations = LLCachedControl<bool>(gSavedPerAccountSettings, "OverrideAnimations", false); } @@ -2586,6 +2604,10 @@ void LLVOAvatar::updateMeshData() f_num++ ; } } + + mDirtyMesh = 0; + mNeedsSkin = true; + mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); } } @@ -2805,6 +2827,28 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) // force immediate pixel area update on avatars using last frames data (before drawable or camera updates) setPixelAreaAndAngle(gAgent); + if (!isSelf()) + { + F32 current_pixel_area = getPixelArea(); + if (mLastCulledPixelArea >= 0.f) + { + // Avoid rapidly switching two avatars back and forth between ranks. + // And update frequency reduction + F32 pixel_area_change = fabsf(current_pixel_area - mLastCulledPixelArea) / mLastCulledPixelArea; + if (pixel_area_change > 0.1f) // 10% threshold + { + sAvatarCullNeedsUpdate = true; + mLastCulledPixelArea = current_pixel_area; + } + } + else + { + // First frame + sAvatarCullNeedsUpdate = true; + mLastCulledPixelArea = current_pixel_area; + } + } + // force asynchronous drawable update if(mDrawable.notNull()) { @@ -3119,7 +3163,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) if (isImpostor() && !mNeedsImpostorUpdate) { - LL_ALIGN_16(LLVector4a ext[2]); + LLVector4a ext[2]; F32 distance; LLVector3 angle; @@ -5262,9 +5306,11 @@ void LLVOAvatar::updateVisibility() LL_DEBUGS("AvatarRender") << "visible was " << mVisible << " now " << visible << LL_ENDL; } + if (mVisible != visible) + { + setCullNeedsUpdate(); + } mVisible = visible; - - mVisibilityPreference = visible ? getPixelArea() : 0; } // private @@ -5305,9 +5351,6 @@ U32 LLVOAvatar::renderSkinned() if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4) { updateMeshData(); - mDirtyMesh = 0; - mNeedsSkin = true; - mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); } } @@ -5576,7 +5619,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); + //gGL.setLineWidth(thickness); gGL.vertex3fv((pos+left-up).mV); gGL.vertex3fv((pos-left-up).mV); gGL.vertex3fv((pos-left-up).mV); @@ -8857,7 +8900,8 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading) bool LLVOAvatar::isFullyLoaded() const { - return (mRenderUnloadedAvatar && !isSelf()) || mFullyLoaded; + static LLCachedControl<bool> render_unloaded_avatar(gSavedSettings, "RenderUnloadedAvatar", false); + return (render_unloaded_avatar && !isSelf()) || mFullyLoaded; } bool LLVOAvatar::hasFirstFullAttachmentData() const @@ -10179,7 +10223,7 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte if (visualParamWeightsAreDefault() && mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT_SECONDS) { // re-request appearance, hoping that it comes back with a shape next time - LL_INFOS() << "Re-requesting AvatarAppearance for object: " << getID() << LL_ENDL; + LL_INFOS() << "Re-requesting AvatarAppearance for agent: " << getID() << LL_ENDL; LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); mRuthTimer.reset(); } @@ -10209,7 +10253,7 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte setCompositeUpdatesEnabled( true ); // If all of the avatars are completely baked, release the global image caches to conserve memory. - cullAvatarsByPixelArea(); + setCullNeedsUpdate(); if (isSelf()) { @@ -10873,39 +10917,71 @@ S32 LLVOAvatar::getUnbakedPixelAreaRank() return 0; } -// static +// static, gets called once per frame from updateApparentAngles. void LLVOAvatar::cullAvatarsByPixelArea() { - LLCharacter::sInstances.sort([](LLCharacter* lhs, LLCharacter* rhs) - { - return ((LLVOAvatar*)lhs)->mVisibilityPreference > ((LLVOAvatar*)rhs)->mVisibilityPreference; - }); + F64 current_time = LLFrameTimer::getElapsedSeconds(); + bool needs_resort = sAvatarCullNeedsUpdate || ((current_time - sLastCullUpdateTime) >= 1.0); - // Update the avatars that have changed status - U32 rank = 2; // Rank 1 is reserved for self. - for (LLCharacter* character : LLCharacter::sInstances) + if (needs_resort) { - LLVOAvatar* inst = (LLVOAvatar*)character; - bool culled = !inst->isSelf() && !inst->isFullyBaked(); - - if (inst->mCulled != culled) + LLCharacter::sInstances.sort([](LLCharacter* lhs, LLCharacter* rhs) { - inst->mCulled = culled; - LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL; - inst->updateMeshTextures(); - } + LLVOAvatar* lhs_av = (LLVOAvatar*)lhs; + LLVOAvatar* rhs_av = (LLVOAvatar*)rhs; + if (lhs_av->mVisible != rhs_av->mVisible) + { + return lhs_av->mVisible; + } + // Sort by pixel area in descending order (larger pixel area = higher priority) + return lhs_av->getPixelArea() > rhs_av->getPixelArea(); + }); - if (inst->isSelf()) - { - inst->setVisibilityRank(1); - } - else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) + // Update the avatars that have changed status + U32 rank = 2; // Rank 1 is reserved for self. + for (LLCharacter* character : LLCharacter::sInstances) { - inst->setVisibilityRank(rank++); + LLVOAvatar* inst = (LLVOAvatar*)character; + bool culled = !inst->isSelf() && !inst->isFullyBaked(); + + if (inst->mCulled != culled) + { + inst->mCulled = culled; + LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL; + inst->updateMeshTextures(); + } + + if (inst->isSelf()) + { + inst->setVisibilityRank(1); + } + else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) + { + inst->setVisibilityRank(rank++); + } + else + { + inst->setVisibilityRank(sMaxNonImpostors * 5); + } + inst->mLastCulledPixelArea = inst->getPixelArea(); } - else + sAvatarCullNeedsUpdate = false; + sLastCullUpdateTime = current_time; + } + else + { + for (LLCharacter* character : LLCharacter::sInstances) { - inst->setVisibilityRank(sMaxNonImpostors * 5); + // Todo: this can be optimized by tracking baked's callbacks + LLVOAvatar* inst = (LLVOAvatar*)character; + bool culled = !inst->isSelf() && !inst->isFullyBaked(); + + if (inst->mCulled != culled) + { + inst->mCulled = culled; + LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled") << LL_ENDL; + inst->updateMeshTextures(); + } } } @@ -11001,9 +11077,6 @@ bool LLVOAvatar::updateLOD() if (mDirtyMesh >= 2 || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY)) { //LOD changed or new mesh created, allocate new vertex buffer if needed updateMeshData(); - mDirtyMesh = 0; - mNeedsSkin = true; - mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); } updateVisibility(); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index ee1403ff8f..b544a13255 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -97,6 +97,7 @@ class LLVOAvatar : public: friend class LLVOAvatarSelf; friend class LLAvatarCheckImpostorMode; + friend class LLVisualParamHint; /******************************************************************************** ** ** @@ -266,7 +267,7 @@ public: private: //aligned members - LL_ALIGN_16(LLVector4a mImpostorExtents[2]); + LLVector4a mImpostorExtents[2]; //-------------------------------------------------------------------- // Updates @@ -704,7 +705,6 @@ public: protected: void updateVisibility(); private: - F32 mVisibilityPreference; U32 mVisibilityRank; bool mVisible; @@ -752,8 +752,6 @@ private: LLVector3 mLastAnimExtents[2]; LLVector3 mLastAnimBasePos; - LLCachedControl<bool> mRenderUnloadedAvatar; - //-------------------------------------------------------------------- // Wind rippling in clothes //-------------------------------------------------------------------- @@ -772,10 +770,13 @@ private: // Culling //-------------------------------------------------------------------- public: + static void setCullNeedsUpdate() { sAvatarCullNeedsUpdate = true; } static void cullAvatarsByPixelArea(); bool isCulled() const { return mCulled; } private: bool mCulled; + static bool sAvatarCullNeedsUpdate; + static F64 sLastCullUpdateTime; // Time of last cull update //-------------------------------------------------------------------- // Constants @@ -954,9 +955,26 @@ protected: ** APPEARANCE **/ +public: + // Used when an AvatarAppearance UDP message is received before the + // corresponding avatar could be created. + static void registerEarlyAppearance(const LLUUID& av_id) + { + sEarlyAppearanceList.emplace(av_id); + } + + // Entries left behind by agents who never get instantiated (e.g. an + // AvatarAppearance message arrives for an avatar we never rez) are a + // small resource leak. Teleporting to another region invalidates the + // whole list, since it was only ever relevant to avatars in the region + // we're leaving, so clear it out at that point to bound the leak. + static void resetEarlyAppearanceList() + { + sEarlyAppearanceList.clear(); + } + LLPointer<LLAppearanceMessageContents> mLastProcessedAppearance; -public: void parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg); void processAvatarAppearance(LLMessageSystem* mesgsys); void applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params); @@ -988,6 +1006,8 @@ private: bool mIsEditingAppearance; // flag for if we're actively in appearance editing mode bool mUseLocalAppearance; // flag for if we're using a local composite + static uuid_list_t sEarlyAppearanceList; + //-------------------------------------------------------------------- // Visibility //-------------------------------------------------------------------- @@ -1105,7 +1125,7 @@ public: void startTyping() { mTyping = true; mTypingTimer.reset(); } void stopTyping() { mTyping = false; } private: - bool mVisibleChat; + bool mVisibleChat = false; //-------------------------------------------------------------------- // Lip synch morphs @@ -1291,11 +1311,12 @@ public: static F32 sGreyUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) protected: S32 getUnbakedPixelAreaRank(); - bool mHasGrey; + bool mHasGrey = false; private: F32 mMinPixelArea; F32 mMaxPixelArea; - F32 mAdjustedPixelArea; + F32 mAdjustedPixelArea = 0.f; + F32 mLastCulledPixelArea = -1.f; // Pixel area when last culled, for tracking significant changes std::string mDebugText; std::string mBakedTextureDebugText; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index e5c14a34a5..42cec5854c 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -754,6 +754,27 @@ bool LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight) return setParamWeight(param,weight); } +bool LLVOAvatarSelf::setVisualParamWeight(S32 index, S32 type, F32 weight) +{ + LLViewerVisualParam* param = (LLViewerVisualParam*)LLCharacter::getVisualParam(index); + if (!param) + { + return false; + } + if (param->getWearableType() == type) + { + return setParamWeight(param, weight); + } + else + { + // setVisualParamWeight at the moment is only used in writeToAvatar. + // The type is supposed to match since wearable is a subset of avatar by type. + llassert(false); + LL_WARNS() << "Visual param index " << index << " is not of type " << type << LL_ENDL; + } + return false; +} + bool LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight) { if (!param) diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 45985b2a80..ff8cbc20a1 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -97,6 +97,7 @@ public: /*virtual*/ bool setVisualParamWeight(const LLVisualParam *which_param, F32 weight); /*virtual*/ bool setVisualParamWeight(const char* param_name, F32 weight); /*virtual*/ bool setVisualParamWeight(S32 index, F32 weight); + /*virtual*/ bool setVisualParamWeight(S32 index, S32 type, F32 weight); /*virtual*/ void updateVisualParams(); void writeWearablesToAvatar(); /*virtual*/ void idleUpdateAppearanceAnimation(); diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index e513a3813f..df14b46acd 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -1252,7 +1252,7 @@ void LLVOCache::removeCache(ELLPath location, bool started) std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname); LL_INFOS() << "Removing cache at " << cache_dir << LL_ENDL; gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files - LLFile::rmdir(cache_dir); + LLFile::remove(cache_dir); clearCacheInMemory(); mInitialized = false; @@ -1372,7 +1372,7 @@ void LLVOCache::removeFromCache(HeaderEntryInfo* entry) std::string filename; getObjectCacheFilename(entry->mHandle, filename); LL_WARNS("GLTF", "VOCache") << "Removing object cache for handle " << entry->mHandle << "Filename: " << filename << LL_ENDL; - LLAPRFile::remove(filename, mLocalAPRFilePoolp); + LLFile::remove(filename); // Note: `removeFromCache` should take responsibility for cleaning up all cache artefacts specfic to the handle/entry. // as such this now includes the generic extras @@ -1396,7 +1396,7 @@ void LLVOCache::readCacheHeader() clearCacheInMemory(); bool success = true ; - if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp)) + if (LLFile::isfile(mHeaderFileName)) { LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp); @@ -1756,7 +1756,7 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry: if(mReadOnly) { - LL_WARNS() << "Not writing cache for " << filename << " (handle:" << handle << "): Cache is currently in read-only mode." << LL_ENDL; + LL_INFOS() << "Not writing cache for " << filename << " (handle:" << handle << "): Cache is currently in read-only mode." << LL_ENDL; return ; } @@ -1797,7 +1797,10 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry: if(!dirty_cache) { - LL_WARNS() << "Skipping write to cache for " << filename << " (handle:" << handle << "): cache not dirty" << LL_ENDL; + if (!LLAppViewer::instance()->isQuitting()) + { + LL_WARNS() << "Skipping write to cache for " << filename << " (handle:" << handle << "): cache not dirty" << LL_ENDL; + } return ; //nothing changed, no need to update. } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 0852258994..6a5e80365b 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -128,6 +128,12 @@ void LLVoiceChannel::onChange(EStatusType type, const LLSD& channelInfo, bool pr { mChannelInfo = channelInfo; } + + if (!LLVoiceClient::instanceExists()) + { + return; + } + if (!LLVoiceClient::getInstance()->compareChannels(mChannelInfo, channelInfo)) { return; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 95b6bb4227..22980f8047 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -25,11 +25,10 @@ */ #include "llvoiceclient.h" -#if __FreeBSD__ || _M_ARM64 -#include "llviewerregion.h" -#include "llmutelist.h" -#else +#ifndef DISABLE_WEBRTC #include "llvoicewebrtc.h" +#else +#include "llviewerregion.h" #endif #include "llviewernetwork.h" #include "llviewercontrol.h" @@ -44,6 +43,7 @@ #include "lltrans.h" #include "lluiusage.h" #include "llnearbyvoicemoderation.h" +#include "llmutelist.h" const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; @@ -121,8 +121,8 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv LLVoiceModuleInterface *getVoiceModule(const std::string &voice_server_type) { -#if !__FreeBSD__ && !_M_ARM64 - if (voice_server_type == WEBRTC_VOICE_SERVER_TYPE) +#ifndef DISABLE_WEBRTC + if (voice_server_type == WEBRTC_VOICE_SERVER_TYPE || voice_server_type.empty()) { return (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance(); } @@ -168,7 +168,7 @@ void LLVoiceClient::init(LLPumpIO *pump) { // Initialize all of the voice modules m_servicePump = pump; -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->init(pump); #endif } @@ -180,7 +180,7 @@ void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &age mRegionChangedCallbackSlot.disconnect(); } mRegionChangedCallbackSlot = gAgent.addRegionChangedCallback(boost::bind(&LLVoiceClient::onRegionChanged, this)); -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->userAuthorized(user_id, agentID); #endif } @@ -188,7 +188,7 @@ void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &age void LLVoiceClient::handleSimulatorFeaturesReceived(const LLSD &simulatorFeatures) { std::string voiceServerType = simulatorFeatures["VoiceServerType"].asString(); -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (voiceServerType.empty()) { voiceServerType = WEBRTC_VOICE_SERVER_TYPE; @@ -293,14 +293,14 @@ void LLVoiceClient::setNonSpatialVoiceModule(const std::string &voice_server_typ void LLVoiceClient::setHidden(bool hidden) { LL_INFOS("Voice") << "( " << (hidden ? "true" : "false") << " )" << LL_ENDL; -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setHidden(hidden); #endif } void LLVoiceClient::terminate() { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->terminate(); @@ -340,7 +340,7 @@ void LLVoiceClient::updateSettings() updateMicMuteLogic(); -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->updateSettings(); #endif } @@ -350,47 +350,47 @@ void LLVoiceClient::updateSettings() void LLVoiceClient::tuningStart() { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->tuningStart(); #endif } void LLVoiceClient::tuningStop() { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->tuningStop(); #endif } bool LLVoiceClient::inTuningMode() { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->inTuningMode(); +#else + return false; #endif } void LLVoiceClient::tuningSetMicVolume(float volume) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->tuningSetMicVolume(volume); #endif } void LLVoiceClient::tuningSetSpeakerVolume(float volume) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->tuningSetSpeakerVolume(volume); #endif } float LLVoiceClient::tuningGetEnergy(void) { -#if __FreeBSD__ || _M_ARM64 - return 0.0f; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->tuningGetEnergy(); +#else + return 0.f; #endif } @@ -399,61 +399,61 @@ float LLVoiceClient::tuningGetEnergy(void) bool LLVoiceClient::deviceSettingsAvailable() { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->deviceSettingsAvailable(); +#else + return false; #endif } bool LLVoiceClient::deviceSettingsUpdated() { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->deviceSettingsUpdated(); +#else + return false; #endif } void LLVoiceClient::refreshDeviceLists(bool clearCurrentList) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->refreshDeviceLists(clearCurrentList); #endif } void LLVoiceClient::setCaptureDevice(const std::string& name) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setCaptureDevice(name); #endif } void LLVoiceClient::setRenderDevice(const std::string& name) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setRenderDevice(name); #endif } const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices() { -#if __FreeBSD__ || _M_ARM64 - static LLVoiceDeviceList devices; - return devices; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getCaptureDevices(); +#else + static LLVoiceDeviceList dummy_device_list; + return dummy_device_list; #endif } const LLVoiceDeviceList& LLVoiceClient::getRenderDevices() { -#if __FreeBSD__ || _M_ARM64 - static LLVoiceDeviceList devices; - return devices; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getRenderDevices(); +#else + static LLVoiceDeviceList dummy_device_list; + return dummy_device_list; #endif } @@ -463,17 +463,17 @@ const LLVoiceDeviceList& LLVoiceClient::getRenderDevices() void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->getParticipantList(participants); #endif } bool LLVoiceClient::isParticipant(const LLUUID &speaker_id) const { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->isParticipant(speaker_id); +#else + return false; #endif } @@ -566,19 +566,19 @@ void LLVoiceClient::activateSpatialChannel(bool activate) bool LLVoiceClient::isCurrentChannel(const LLSD& channelInfo) { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->isCurrentChannel(channelInfo); +#else + return false; #endif } bool LLVoiceClient::compareChannels(const LLSD &channelInfo1, const LLSD &channelInfo2) { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->compareChannels(channelInfo1, channelInfo2); +#else + return false; #endif } @@ -604,7 +604,7 @@ LLVoiceP2POutgoingCallInterface *LLVoiceClient::getOutgoingCallInterface(const L LLVoiceVersionInfo versionInfo = LLVoiceClient::getInstance()->getVersion(); voice_server_type = versionInfo.internalVoiceServerType; } -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (voiceChannelInfo.has("voice_server_type") && voiceChannelInfo["voice_server_type"] != voice_server_type) { // there's a mismatch between what the peer is offering and what our server @@ -622,14 +622,14 @@ LLVoiceP2POutgoingCallInterface *LLVoiceClient::getOutgoingCallInterface(const L void LLVoiceClient::setVoiceVolume(F32 volume) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setVoiceVolume(volume); #endif } void LLVoiceClient::setMicGain(F32 gain) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setMicGain(gain); #endif } @@ -677,7 +677,7 @@ bool LLVoiceClient::voiceEnabled() void LLVoiceClient::setVoiceEnabled(bool enabled) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->setVoiceEnabled(enabled); @@ -701,7 +701,7 @@ void LLVoiceClient::updateMicMuteLogic() // Either of these always overrides any other PTT setting. new_mic_mute = true; } -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setMuteMic(new_mic_mute); #endif } @@ -800,20 +800,20 @@ bool LLVoiceClient::getVoiceEnabled(const LLUUID& id) const std::string LLVoiceClient::getDisplayName(const LLUUID& id) const { -#if __FreeBSD__ || _M_ARM64 - std::string result; -#else +#ifndef DISABLE_WEBRTC std::string result = LLWebRTCVoiceClient::getInstance()->getDisplayName(id); +#else + std::string result; #endif return result; } bool LLVoiceClient::isVoiceWorking() const { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->isVoiceWorking(); +#else + return false; #endif } @@ -829,10 +829,10 @@ bool LLVoiceClient::isOnlineSIP(const LLUUID& id) bool LLVoiceClient::getIsSpeaking(const LLUUID& id) { -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getIsSpeaking(id); +#else + return false; #endif } @@ -840,19 +840,19 @@ bool LLVoiceClient::getIsModeratorMuted(const LLUUID& id) { // don't bother worrying about p2p calls, as // p2p calls don't have mute. -#if __FreeBSD__ || _M_ARM64 - return false; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getIsModeratorMuted(id); +#else + return false; #endif } F32 LLVoiceClient::getCurrentPower(const LLUUID& id) { -#if __FreeBSD__ || _M_ARM64 - return 0.0f; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getCurrentPower(id); +#else + return 0.f; #endif } @@ -865,16 +865,16 @@ bool LLVoiceClient::getOnMuteList(const LLUUID& id) F32 LLVoiceClient::getUserVolume(const LLUUID& id) { -#if __FreeBSD__ || _M_ARM64 - return 0.0f; -#else +#ifndef DISABLE_WEBRTC return LLWebRTCVoiceClient::getInstance()->getUserVolume(id); +#else + return 0.f; #endif } void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->setUserVolume(id, volume); #endif } @@ -884,14 +884,14 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -901,14 +901,14 @@ void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) void LLVoiceClient::addObserver(LLFriendObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } void LLVoiceClient::removeObserver(LLFriendObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -918,14 +918,14 @@ void LLVoiceClient::removeObserver(LLFriendObserver* observer) void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer) { -#if !__FreeBSD__ && !_M_ARM64 +#ifndef DISABLE_WEBRTC if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -973,8 +973,8 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode LLVoiceModuleInterface *voiceModule = NULL; -#if !__FreeBSD__ && !_M_ARM64 - if (voice_server_type == "webrtc" || voice_server_type.empty()) +#ifndef DISABLE_WEBRTC + if (voice_server_type == WEBRTC_VOICE_SERVER_TYPE || voice_server_type.empty()) { voiceModule = (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance(); } diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index c5704982b8..e6dac0530d 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -32,7 +32,6 @@ #include "llviewerprecompiledheaders.h" #include "llviewercontrol.h" #include "llglheaders.h" -#include "llsphere.h" #include "llvoicevisualizer.h" #include "llviewercamera.h" #include "llviewerobject.h" diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 33cdf66272..e1cae2db0b 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -208,6 +208,7 @@ LLSD LLVoiceWebRTCStats::read() /////////////////////////////////////////////////////////////////////////////////////////////// bool LLWebRTCVoiceClient::sShuttingDown = false; +bool LLWebRTCVoiceClient::sWebRTCTerminated = false; LLWebRTCVoiceClient::LLWebRTCVoiceClient() : mHidden(false), @@ -233,6 +234,7 @@ LLWebRTCVoiceClient::LLWebRTCVoiceClient() : mWebRTCDeviceInterface(nullptr) { sShuttingDown = false; + sWebRTCTerminated = false; mSpeakerVolume = 0.0; @@ -301,11 +303,81 @@ void LLWebRTCVoiceClient::terminate() mVoiceEnabled = false; sShuttingDown = true; // so that coroutines won't post more work. + + drainConnections(); + + sWebRTCTerminated = true; llwebrtc::terminate(); mWebRTCDeviceInterface = nullptr; } +// Close the live peer connections before handing control to +// llwebrtc::terminate(). +// +// Anything still open when terminate() runs gets closed inline and serially on +// the signaling thread, under a single 10s budget that is also paying for the +// audio device shutdown. An estate session can hold ten live connections -- +// the current region plus up to eight neighbours, plus any group or ad-hoc +// session -- each needing a full DTLS/SCTP teardown, so that budget is not +// generous. Closing them here lets the teardown proceed asynchronously on the +// signaling thread while this thread keeps pumping. +// +// It also quiets the per-connection stats poll before terminate() runs. A +// GetStats request left in flight makes PeerConnection::Close() block in +// RTCStatsCollector::WaitForPendingRequest(), which waits on the network thread +// with no timeout at all. +// +// Best effort: whatever hasn't closed by the deadline is left to +// llwebrtc::terminate(), exactly as before. +void LLWebRTCVoiceClient::drainConnections() +{ + // Marks every session and connection as shutting down. This also stops + // estateSessionState::processConnectionStates() from spinning up + // replacement connections to neighbouring regions while we drain. + sessionState::for_each(boost::bind(predShutdownSession, _1)); + + // Long enough for a local close to complete, short enough that a wedged + // connection doesn't noticeably delay quitting. The remaining budget in + // llwebrtc::terminate() is the real backstop. + constexpr F32 DRAIN_TIMEOUT_SECONDS = 3.0f; + constexpr U32 DRAIN_POLL_MS = 10; + + // Wait on the peer connections being closed rather than on the sessions + // being reaped. A connection that still has an HTTP coroutine in flight + // holds its session alive until mOutstandingRequests unwinds, and those + // coroutines don't run from here -- but its peer connection has already + // been closed by then, which is all terminate() cares about. + LLTimer timer; + while (!sessionState::allSessionsClosed() && timer.getElapsedTimeF32() < DRAIN_TIMEOUT_SECONDS) + { + // OnPeerConnectionClosed comes back through the main queue, so it has + // to be pumped or the state machines never see connections finish. + if (auto main_queue = mMainQueue.lock()) + { + main_queue->runFor(std::chrono::milliseconds(DRAIN_POLL_MS)); + } + sessionState::processSessionStates(); + + if (!sessionState::allSessionsClosed()) + { + ms_sleep(DRAIN_POLL_MS); + } + } + + if (!sessionState::allSessionsClosed()) + { + LL_WARNS("Voice") << "Timed out draining voice connections after " + << DRAIN_TIMEOUT_SECONDS + << "s; leaving the rest to llwebrtc::terminate()." << LL_ENDL; + } + else + { + LL_INFOS("Voice") << "Voice connections drained in " + << timer.getElapsedTimeF32() << "s." << LL_ENDL; + } +} + //--------------------------------------------------- void LLWebRTCVoiceClient::cleanUp() @@ -1890,6 +1962,7 @@ void LLWebRTCVoiceClient::userAuthorized(const std::string& user_id, const LLUUI if (sShuttingDown) { sShuttingDown = false; // was terminated, restart + sWebRTCTerminated = false; initWebRTC(); } } @@ -2173,6 +2246,30 @@ void LLWebRTCVoiceClient::sessionState::processSessionStates() } } +bool LLWebRTCVoiceClient::sessionState::allConnectionsClosed() const +{ + for (const auto &connection : mWebRTCConnections) + { + if (!connection->isClosed()) + { + return false; + } + } + return true; +} + +bool LLWebRTCVoiceClient::sessionState::allSessionsClosed() +{ + for (const auto &session : sSessions) + { + if (session.second && !session.second->allConnectionsClosed()) + { + return false; + } + } + return true; +} + // process the states on each connection associated with a session. bool LLWebRTCVoiceClient::sessionState::processConnectionStates() { @@ -2416,7 +2513,7 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s // retries wait a short period...randomize it so // all clients don't try to reconnect at once. - mRetryWaitSecs = (F32)((F32) rand() / (RAND_MAX)) + 0.5f; + mRetryWaitSecs = (F32)((F32) rand() / F32(RAND_MAX)) + 0.5f; mWebRTCPeerConnectionInterface = llwebrtc::newPeerConnection(); mWebRTCPeerConnectionInterface->setSignalingObserver(this); @@ -2425,12 +2522,18 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s LLVoiceWebRTCConnection::~LLVoiceWebRTCConnection() { - if (LLWebRTCVoiceClient::isShuttingDown()) + if (LLWebRTCVoiceClient::isWebRTCTerminated()) { - // peer connection and observers will be cleaned up - // by llwebrtc::terminate() on shutdown. + // peer connection and observers have already been cleaned up + // by llwebrtc::terminate(). return; } + // Note this is deliberately keyed off isWebRTCTerminated() rather than + // isShuttingDown(): connections drained by drainConnections() are destroyed + // while the webrtc library is still fully alive, and must unregister + // themselves and release the peer connection like any other close. Leaving + // a freed observer registered would hand llwebrtc::terminate() a dangling + // pointer to call OnPeerConnectionClosed() on. mWebRTCPeerConnectionInterface->unsetSignalingObserver(this); llwebrtc::freePeerConnection(mWebRTCPeerConnectionInterface); } @@ -3031,7 +3134,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() case VOICE_STATE_SESSION_UP: { mRetryWaitPeriod = 0; - mRetryWaitSecs = (F32)((F32)rand() / (RAND_MAX)) + 0.5f; + mRetryWaitSecs = (F32)((F32)rand() / F32(RAND_MAX)) + 0.5f; // we'll stay here as long as the session remains up. if (mShutDown) @@ -3076,7 +3179,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() { // back off the retry period, and do it by a small random // bit so all clients don't reconnect at once. - mRetryWaitSecs += (F32)((F32) rand() / (RAND_MAX)) + 0.5f; + mRetryWaitSecs += (F32)((F32) rand() / F32(RAND_MAX)) + 0.5f; mRetryWaitPeriod = 0; } } @@ -3092,8 +3195,10 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() } else { - // llwebrtc::terminate() is already shuting down the connection. - setVoiceConnectionState(VOICE_STATE_WAIT_FOR_CLOSE); + // Shutting down: skip the courtesy logout to the sim (the HTTP + // round trip would just delay quitting) and go straight to + // dropping the webrtc connection. + setVoiceConnectionState(VOICE_STATE_SESSION_EXIT); } break; @@ -3104,11 +3209,10 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() { setVoiceConnectionState(VOICE_STATE_WAIT_FOR_CLOSE); mOutstandingRequests++; - if (!LLWebRTCVoiceClient::isShuttingDown()) - { - mWebRTCPeerConnectionInterface->shutdownConnection(); - } - // else was already posted by llwebrtc::terminate(). + // Always drop the connection ourselves, including during shutdown: + // drainConnections() runs before llwebrtc::terminate(), so nothing + // else has posted the close yet. + mWebRTCPeerConnectionInterface->shutdownConnection(); break; } @@ -3197,7 +3301,14 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b if (!mPrimary && isSpatial() && gAgent.getRegion()) { is_primary_region = (mRegionID == gAgent.getRegion()->getRegionID()); - LL_WARNS() << "mPrimary is false, expected: " << is_primary_region << " connection state: " << getVoiceConnectionState() << LL_ENDL; + if (is_primary_region) + { + LL_WARNS("Voice") << "mPrimary is false, expected: true, connection state: " << getVoiceConnectionState() << LL_ENDL; + } + else + { + LL_INFOS("Voice") << "mPrimary is false, expected: false, connection state: " << getVoiceConnectionState() << LL_ENDL; + } } boost::json::object voice_data = voice_data_parsed.as_object(); boost::json::object mute; diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index a3f3ebe8b0..05f03ee8a6 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -79,6 +79,12 @@ public: static bool isShuttingDown() { return sShuttingDown; } + // True once llwebrtc::terminate() has been entered. Between + // isShuttingDown() and this, the webrtc library is still fully alive and + // connections must still release their peer connections normally -- see + // drainConnections() and ~LLVoiceWebRTCConnection(). + static bool isWebRTCTerminated() { return sWebRTCTerminated; } + const LLVoiceVersionInfo& getVersion() override; void updateVersion(); @@ -306,6 +312,9 @@ public: bool isEmpty() { return mWebRTCConnections.empty(); } + bool allConnectionsClosed() const; + static bool allSessionsClosed(); + virtual bool isSpatial() = 0; virtual bool isEstate() = 0; virtual bool isCallbackPossible() = 0; @@ -455,6 +464,10 @@ private: /// Clean up objects created during a voice session. void cleanUp(); + /// Close the live peer connections before handing off to + /// llwebrtc::terminate(). Bounded and best effort. + void drainConnections(); + LL::WorkQueue::weak_t mMainQueue; F32 mTuningMicGain; @@ -539,6 +552,7 @@ private: // These variables can last longer than WebRTC in coroutines so we need them as static static bool sShuttingDown; + static bool sWebRTCTerminated; LLEventMailDrop mWebRTCPump; @@ -643,6 +657,12 @@ class LLVoiceWebRTCConnection : return mShutDown; } + // True once the webrtc peer connection has finished closing. The + // connection object can outlive this while it waits for outstanding + // requests to unwind, so this -- not reaping -- is what drainConnections() + // waits on. + bool isClosed() const { return mVoiceConnectionState == VOICE_STATE_CLOSED; } + void OnVoiceConnectionRequestSuccess(const LLSD &body); void resetConnectionStats(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 16c262d1ad..13707b1889 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4445,7 +4445,7 @@ U32 LLVOVolume::getTriangleCount(S32* vcount) const return count; } -U32 LLVOVolume::getHighLODTriangleCount() +U32 LLVOVolume::getLODTriangleCount(S32 lod) { U32 ret = 0; @@ -4453,16 +4453,16 @@ U32 LLVOVolume::getHighLODTriangleCount() if (!isSculpted()) { - LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3); + LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), lod); ret = ref->getNumTriangles(); LLPrimitive::getVolumeManager()->unrefVolume(ref); } else if (isMesh()) { - LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3); + LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), lod); if (!ref->isMeshAssetLoaded() || ref->getNumVolumeFaces() == 0) { - gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH); + gMeshRepo.loadMesh(this, volume->getParams(), lod); } ret = ref->getNumTriangles(); LLPrimitive::getVolumeManager()->unrefVolume(ref); @@ -4475,6 +4475,11 @@ U32 LLVOVolume::getHighLODTriangleCount() return ret; } +U32 LLVOVolume::getHighLODTriangleCount() +{ + return getLODTriangleCount(LLModel::LOD_HIGH); +} + //static void LLVOVolume::preUpdateGeom() { diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index b6044bc319..00d6138512 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -155,6 +155,7 @@ public: /*virtual*/ bool getCostData(LLMeshCostData& costs) const override; /*virtual*/ U32 getTriangleCount(S32* vcount = NULL) const override; + /*virtual*/ U32 getLODTriangleCount(S32 lod) override; /*virtual*/ U32 getHighLODTriangleCount() override; /*virtual*/ bool lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index b5ee42f36c..98d771f8da 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -36,17 +36,16 @@ #include "llenvironment.h" #include "llsettingssky.h" -constexpr U32 MIN_SKY_DETAIL = 8; -constexpr U32 MAX_SKY_DETAIL = 180; +constexpr U32 SKY_DETAIL = 18; // Any lower and there will be artifacts inline U32 LLVOWLSky::getNumStacks(void) { - return llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); + return SKY_DETAIL; } inline U32 LLVOWLSky::getNumSlices(void) { - return 2 * llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); + return 2 * SKY_DETAIL; } inline U32 LLVOWLSky::getStripsNumVerts(void) diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index 38e49d0750..69160bcd6e 100644 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -90,6 +90,12 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& "to list; all nodes from root if no [\"under\"].", &LLWindowListener::getPaths, LLSDMap("reply", LLSD())); + add("getSubtree", + "Send on [\"reply\"] a nested tree of info maps for all descendants of\n" + "optional [\"under\"] path (default: root). Each node contains the same\n" + "fields as getInfo plus a [\"children\"] array of child nodes.", + &LLWindowListener::getSubtree, + LLSDMap("reply", LLSD())); add("keyDown", keySomething + "keypress event.\n" + keyExplain + "The [\"char\"] parameter detects and handles non-ASCII characters seperately\n" + mask, @@ -114,6 +120,22 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& "Paste specified [\"text\"] into the current edit field\n" "Optional [\"path\"] specifies target UI element (must be focusable).", &LLWindowListener::pasteText); + add("cut", + "Cut selected content from the focused edit field.\n" + "Optional [\"path\"] specifies target UI element (must be focusable).", + &LLWindowListener::cut); + add("copy", + "Copy selected content from the focused edit field.\n" + "Optional [\"path\"] specifies target UI element (must be focusable).", + &LLWindowListener::copy); + add("paste", + "Paste clipboard contents into the focused edit field.\n" + "Optional [\"path\"] specifies target UI element (must be focusable).", + &LLWindowListener::paste); + add("selectAll", + "Select all content in the focused edit field.\n" + "Optional [\"path\"] specifies target UI element (must be focusable).", + &LLWindowListener::selectAll); } template <typename MAPPED> @@ -265,6 +287,41 @@ void LLWindowListener::getPaths(LLSD const & request) } } +static LLSD buildSubtree(LLView* view) +{ + LLSD children; + LLSD node = view->getInfo(); + for (LLView::child_list_const_iter_t it = view->beginChild(); it != view->endChild(); ++it) + { + children.append(buildSubtree(*it)); + } + node["children"] = children; + return node; +} + +void LLWindowListener::getSubtree(LLSD const & request) +{ + Response response(LLSD(), request); + LLView* root = LLUI::getInstance()->getRootView(); + LLView* base = nullptr; + std::string under(request["under"]); + + if (under.empty()) + { + base = root; + } + else + { + base = LLUI::getInstance()->resolvePath(root, under); + if (!base) + { + return response.error(STRINGIZE(request["op"].asString() << " request specified invalid \"under\" path: '" << under << "'")); + } + } + + response.setResponse(buildSubtree(base)); +} + void LLWindowListener::keyDown(LLSD const & evt) { Response response(LLSD(), evt); @@ -616,3 +673,77 @@ void LLWindowListener::pasteText(LLSD const & evt) LLClipboard::instance().reset(); } } + +// Helper: optionally focus a view by path; returns false and sets response error on failure. +static bool focusViewByPath(const LLSD& evt, LLEventAPI::Response& response) +{ + if (!evt.has("path")) + return true; + + std::string path(evt["path"]); + LLView* target_view = LLUI::getInstance()->resolvePath(LLUI::getInstance()->getRootView(), path); + if (!target_view) + { + response.error(STRINGIZE(evt["op"].asString() << " request specified invalid \"path\": " << path)); + return false; + } + if (!target_view->isAvailable()) + { + response.error(STRINGIZE("Target view specified by \"path\": " << path << " is not visible")); + return false; + } + gFocusMgr.setKeyboardFocus(target_view); + return true; +} + +void LLWindowListener::cut(LLSD const & evt) +{ + Response response(LLSD(), evt); + if (!focusViewByPath(evt, response)) + return; + if (!LLEditMenuHandler::gEditMenuHandler) + { + response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available")); + return; + } + LLEditMenuHandler::gEditMenuHandler->cut(); +} + +void LLWindowListener::copy(LLSD const & evt) +{ + Response response(LLSD(), evt); + if (!focusViewByPath(evt, response)) + return; + if (!LLEditMenuHandler::gEditMenuHandler) + { + response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available")); + return; + } + LLEditMenuHandler::gEditMenuHandler->copy(); +} + +void LLWindowListener::paste(LLSD const & evt) +{ + Response response(LLSD(), evt); + if (!focusViewByPath(evt, response)) + return; + if (!LLEditMenuHandler::gEditMenuHandler) + { + response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available")); + return; + } + LLEditMenuHandler::gEditMenuHandler->paste(); +} + +void LLWindowListener::selectAll(LLSD const & evt) +{ + Response response(LLSD(), evt); + if (!focusViewByPath(evt, response)) + return; + if (!LLEditMenuHandler::gEditMenuHandler) + { + response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available")); + return; + } + LLEditMenuHandler::gEditMenuHandler->selectAll(); +} diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h index d3a16cfde9..06e4090f6d 100644 --- a/indra/newview/llwindowlistener.h +++ b/indra/newview/llwindowlistener.h @@ -41,6 +41,7 @@ public: void getInfo(LLSD const & evt); void getPaths(LLSD const & evt); + void getSubtree(LLSD const & evt); void keyDown(LLSD const & evt); void keyUp(LLSD const & evt); void mouseDown(LLSD const & evt); @@ -48,6 +49,10 @@ public: void mouseMove(LLSD const & evt); void mouseScroll(LLSD const & evt); void pasteText(LLSD const & evt); + void cut(LLSD const & evt); + void copy(LLSD const & evt); + void paste(LLSD const & evt); + void selectAll(LLSD const & evt); private: LLViewerWindow * mWindow; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index d02694de7d..b09c2d00bb 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -794,10 +794,10 @@ void LLWorld::updateNetStats() S32 packets_in = gMessageSystem->mPacketsIn - mLastPacketsIn; S32 packets_out = gMessageSystem->mPacketsOut - mLastPacketsOut; - S32 packets_lost = gMessageSystem->mDroppedPackets - mLastPacketsLost; + S32 packets_lost = gMessageSystem->mLostPackets - mLastPacketsLost; - F64Bits actual_in_bits(gMessageSystem->mPacketRing.getAndResetActualInBits()); - F64Bits actual_out_bits(gMessageSystem->mPacketRing.getAndResetActualOutBits()); + F64Bits actual_in_bits(gMessageSystem->getAndResetActualInBits()); + F64Bits actual_out_bits(gMessageSystem->getAndResetActualOutBits()); add(LLStatViewer::MESSAGE_SYSTEM_DATA_IN, actual_in_bits); add(LLStatViewer::MESSAGE_SYSTEM_DATA_OUT, actual_out_bits); @@ -806,16 +806,17 @@ void LLWorld::updateNetStats() add(LLStatViewer::PACKETS_OUT, packets_out); add(LLStatViewer::PACKETS_LOST, packets_lost); - F32 total_packets_in = (F32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); + LLTrace::Recording& recording = LLViewerStats::instance().getRecording(); + F32 total_packets_in = (F32)recording.getSum(LLStatViewer::PACKETS_IN); if (total_packets_in > 0.f) { - F32 total_packets_lost = (F32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST); + F32 total_packets_lost = (F32)recording.getSum(LLStatViewer::PACKETS_LOST); sample(LLStatViewer::PACKETS_LOST_PERCENT, LLUnits::Ratio::fromValue((F32)total_packets_lost/(F32)total_packets_in)); } mLastPacketsIn = gMessageSystem->mPacketsIn; mLastPacketsOut = gMessageSystem->mPacketsOut; - mLastPacketsLost = gMessageSystem->mDroppedPackets; + mLastPacketsLost = gMessageSystem->mLostPackets; } @@ -838,7 +839,7 @@ void LLWorld::printPacketsLost() << " packets lost: " << cdp->getPacketsLost() << LL_ENDL; } } - LL_INFOS() << "Packets dropped by Packet Ring: " << gMessageSystem->mPacketRing.getNumDroppedPackets() << LL_ENDL; + LL_INFOS() << "Packets dropped by Packet Ring: " << gMessageSystem->getTotalNumDroppedPackets() << LL_ENDL; } void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data) diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8e7b86eb00..8e7b86eb00 100755..100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 7b0bf6f251..a9183109ef 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -211,7 +211,7 @@ LLXMLRPCTransaction::Impl::Impl mCertStore = gSavedSettings.getString("CertStore"); httpOpts->setSSLVerifyPeer(vefifySSLCert); - httpOpts->setSSLVerifyHost(vefifySSLCert ? 2 : 0); + httpOpts->setSSLVerifyHost(vefifySSLCert); // LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer httpHeaders = std::make_shared<LLCore::HttpHeaders>(); diff --git a/indra/newview/macutil_Prefix.h b/indra/newview/macutil_Prefix.h deleted file mode 100644 index 4972ee4fa5..0000000000 --- a/indra/newview/macutil_Prefix.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @file macutil_Prefix.h - * @brief Precompiled prefix file - * - * $LicenseInfo:firstyear=2005&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$ - */ - -/* - * - * Precompiled prefix file used for - * AutoUpdater - * crashreporter - * - */ - -#include "fix_macros.h" - -#undef verify -#undef require diff --git a/indra/newview/macview_Prefix.h b/indra/newview/macview_Prefix.h deleted file mode 100644 index faad8fa704..0000000000 --- a/indra/newview/macview_Prefix.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * @file macview_Prefix.h - * @brief Prefix header for all source files of the 'newview' target in the 'newview' project. - * - * $LicenseInfo:firstyear=2003&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -// MBW -- This doesn't work. There are some conflicts between things in Carbon.h and some of the linden source. -//#include <Carbon/Carbon.h> - -////////////////// From llagent.cpp -#include "llpreprocessor.h" -#include "stdtypes.h" -#include "stdenums.h" - -#include "llagent.h" - -#include "llcoordframe.h" -#include "indra_constants.h" -#include "llmath.h" -#include "llcriticaldamp.h" -#include "llfocusmgr.h" -#include "llparcel.h" -#include "llpermissions.h" -#include "llregionhandle.h" -#include "m3math.h" -#include "m4math.h" -#include "message.h" -#include "qmath.h" -#include "v3math.h" -#include "v4math.h" -#include "vmath.h" -//#include "llteleportflags.h" - -#include "llbox.h" -#include "llbutton.h" -#include "llconsole.h" -#include "lldrawable.h" -#include "llfirstuse.h" -#include "llfloater.h" -#include "llfloaterbuildoptions.h" -#include "llfloaterchat.h" -#include "llfloatergroups.h" -#include "llfloaterworldmap.h" -#include "llfloatermute.h" -#include "llconversation.h" -#include "llfloatertools.h" -#include "llhudeffectlookat.h" -#include "llhudmanager.h" -#include "lljoystickbutton.h" -#include "llmenugl.h" -#include "llmorphview.h" -#include "llmoveview.h" -#include "llselectmgr.h" -#include "llsky.h" -#include "llrendersphere.h" -#include "llstatusbar.h" -#include "lltalkview.h" -#include "lltool.h" -#include "lltoolfocus.h" -#include "lltoolcomp.h" // for gToolGun -#include "lltoolgrab.h" -#include "lltoolmgr.h" -#include "lltoolpie.h" -#include "llui.h" // for make_ui_sound -#include "llviewercamera.h" -#include "llviewermenu.h" -#include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" -#include "llviewerparceloverlay.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llvoground.h" -#include "llvosky.h" -#include "llworld.h" -#include "pipeline.h" - -/////////////////// From llfloater.cpp -#include "llbutton.h" -#include "lldraghandle.h" -#include "llfocusmgr.h" -#include "llresizebar.h" -#include "llresizehandle.h" -#include "llresmgr.h" -#include "llui.h" -#include "llviewborder.h" -#include "lluictrlfactory.h" - - -/////////////////// From lldrawpool.cpp -#include "llface.h" -#include "llcontrol.h" -#include "pipeline.h" - -#include "llviewerobjectlist.h" // For debug listing. - -//extern LLPipeline gPipeline; - -#include "lldrawpoolsimple.h" -#include "lldrawpoolalpha.h" -#include "lldrawpoolavatar.h" -#include "lldrawpooltree.h" -#include "lldrawpoolterrain.h" -#include "lldrawpoolsky.h" -#include "lldrawpoolwater.h" -#include "lldrawpoolground.h" -#include "lldrawpoolbump.h" - -/////////////////// From llface.cpp -#include "llgl.h" -#include "llviewerimage.h" -#include "llsky.h" -#include "llvosky.h" -#include "llcontrol.h" -#include "v3color.h" -#include "pipeline.h" -#include "llvolume.h" -#include "llviewercamera.h" -#include "lllightconstants.h" - -#include "llvovolume.h" -#include "m3math.h" -#include "lldrawpoolbump.h" - - - -/////////////////// From llpanel.cpp -#include "llpanel.h" - -#include "llfontgl.h" -#include "llrect.h" -#include "llerror.h" -#include "lltimer.h" - -#include "llmenugl.h" -#include "llstatusbar.h" -#include "llui.h" -#include "llkeyboard.h" -#include "llviewerwindow.h" -#include "llcontrol.h" -#include "lluictrl.h" -#include "lluictrlfactory.h" -#include "llviewborder.h" -#include "llviewerimagelist.h" -#include "llbutton.h" -#include "llfocusmgr.h" - - - -/////////////////// From llvovolume.cpp -#include "llvovolume.h" -#include "llviewerimagelist.h" - -#include "llcontrol.h" - -#include "object_flags.h" - -#include "material_codes.h" -#include "llagent.h" -#include "llworld.h" -#include "llviewerregion.h" -#include "llprimitive.h" -#include "llvolume.h" -#include "lldrawable.h" -#include "llface.h" -#include "llvolumemgr.h" -#include "llsky.h" - -#include "pipeline.h" -#include "llmaterialtable.h" -#include "message.h" -#include "llviewertextureanim.h" -#include "llviewercamera.h" -#include "lldrawpoolbump.h" - - -/////////////////// From llagentpilot.cpp -#include "llagentpilot.h" -#include "llagent.h" -#include "llframestats.h" -#include "viewer.h" -#include "llcontrol.h" - - -/////////////////// From llloginview.cpp -#include "llloginview.h" - -#include "indra_constants.h" // for key and mask constants -#include "llfontgl.h" -#include "v4color.h" -#include "llwindow_impl.h" - -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" -#include "llcontrol.h" -#include "lllineeditor.h" -#include "lltextbox.h" -#include "llui.h" -//#include "lluiconstants.h" -#include "llviewerimagelist.h" -#include "llviewermenu.h" // for handle_preferences() -#include "llviewerwindow.h" // to link into child list -#include "llfocusmgr.h" -#include "llmd5.h" -#include "llversion.h" -#include "viewer.h" - diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 9b104f363a..bc1a105e44 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -122,16 +122,27 @@ #include "SMAAAreaTex.h" #include "SMAASearchTex.h" #include "llerror.h" -#ifndef LL_WINDOWS -#define A_GCC 1 + +#if LL_CLANG +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-variable" +#elif LL_GNUC +#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-variable" -#if LL_LINUX #pragma GCC diagnostic ignored "-Wrestrict" #endif +#ifndef LL_WINDOWS +#define A_GCC 1 #endif #define A_CPU 1 #include "app_settings/shaders/class1/deferred/CASF.glsl" // This is also C++ +#if LL_CLANG +#pragma clang diagnostic pop +#elif LL_GNUC +#pragma GCC diagnostic pop +#endif extern bool gSnapshot; bool gShiftFrame = false; @@ -628,6 +639,16 @@ void LLPipeline::init() LLFontWidthBuffer::enableBufferCollection(enable_buffers); }); } + + cntrl_ptr = gSavedSettings.getControl("CollectUIImageVertexBuffers"); + if (cntrl_ptr.notNull()) + { + cntrl_ptr->getCommitSignal()->connect([](LLControlVariable* control, const LLSD& value, const LLSD& previous) + { + bool enable_buffers = control->getValue().asBoolean(); + LLUIImage::enableDisplayListsCollection(enable_buffers); + }); + } } LLPipeline::~LLPipeline() @@ -834,9 +855,8 @@ LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(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(); + bool has_hdr = gSavedSettings.getBOOL("RenderHDREnabled"); + bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr; static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0); @@ -910,12 +930,11 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_) if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots { - GLuint UIFormat = GL_RGBA8; - //if(mHDRDisplay && MPColorPrecision == 2) UIFormat = GL_RGBA16F; + U32 post_color_fmt = gSavedSettings.getBOOL("RenderHighPrecisionPostProcess") ? GL_RGBA16F : GL_RGBA8; if (RenderUIBuffer) { - if (!mUIScreen.allocate(resX, resY, UIFormat)) + if (!mUIScreen.allocate(resX, resY, GL_RGBA8)) { return false; } @@ -923,16 +942,15 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_) if (RenderFSAAType > 0) { - GLuint AAFormat = GL_RGBA8; if(mHDRDisplay && MPColorPrecision != 1) { - AAFormat = GL_RGBA16F; + post_color_fmt = GL_RGBA16F; } - if (!mFXAAMap.allocate(resX, resY, AAFormat)) return false; + if (!mFXAAMap.allocate(resX, resY, post_color_fmt)) return false; if (RenderFSAAType == 2) { - if (!mSMAABlendBuffer.allocate(resX, resY, AAFormat, false)) return false; + if (!mSMAABlendBuffer.allocate(resX, resY, post_color_fmt, false)) return false; } } else @@ -957,10 +975,6 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_) mSceneMap.release(); } -/* - mPostPingMap.allocate(resX, resY, GL_RGBA); - mPostPongMap.allocate(resX, resY, GL_RGBA); -*/ if((hdr && MPColorPrecision == 2) || mHDRDisplay) { mPostMaps[0].allocate(resX, resY, screenFormat); @@ -968,8 +982,8 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_) } else { - mPostMaps[0].allocate(resX, resY, GL_RGBA); - mPostMaps[1].allocate(resX, resY, GL_RGBA); + mPostMaps[0].allocate(resX, resY, post_color_fmt); + mPostMaps[1].allocate(resX, resY, post_color_fmt); } // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes. @@ -1210,6 +1224,8 @@ void LLPipeline::refreshCachedSettings() bool enable_buffers = gSavedSettings.getBOOL("CollectFontVertexBuffers"); LLFontVertexBuffer::enableBufferCollection(enable_buffers); LLFontWidthBuffer::enableBufferCollection(enable_buffers); + enable_buffers = gSavedSettings.getBOOL("CollectUIImageVertexBuffers"); + LLUIImage::enableDisplayListsCollection(enable_buffers); } void LLPipeline::releaseGLBuffers() @@ -4524,7 +4540,7 @@ void LLPipeline::renderPhysicsDisplay() LLGLEnable polygon_offset_line(GL_POLYGON_OFFSET_LINE); glPolygonOffset(3.f, 3.f); - //glLineWidth(3.f); + //gGL.setLineWidth(3.f); LLGLEnable blend(GL_BLEND); gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -4566,7 +4582,7 @@ void LLPipeline::renderPhysicsDisplay() glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); gDebugProgram.unbind(); } @@ -4650,8 +4666,7 @@ void LLPipeline::renderDebug() //NavMesh if ( pathfindingConsole->isRenderNavMesh() ) { - gGL.flush(); - //glLineWidth(2.0f); + //gGL.setLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); LLGLDisable blend(GL_BLEND); @@ -4675,7 +4690,7 @@ void LLPipeline::renderDebug() gGL.flush(); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - //glLineWidth(1.0f); + //gGL.setLineWidth(1.0f); gGL.flush(); } //User designated path @@ -4790,11 +4805,11 @@ void LLPipeline::renderDebug() gPathfindingProgram.uniform1f(sTint, 1.f); gPathfindingProgram.uniform1f(sAlphaScale, 1.f); - //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); + //gGL.setLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); LLGLDisable blendOut(GL_BLEND); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); gGL.flush(); - //glLineWidth(1.f); + //gGL.setLineWidth(1.f); } glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); @@ -4817,7 +4832,7 @@ void LLPipeline::renderDebug() LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); gGL.flush(); - //glLineWidth(2.0f); + //gGL.setLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); @@ -4844,7 +4859,7 @@ void LLPipeline::renderDebug() gPathfindingProgram.bind(); gGL.flush(); - //glLineWidth(1.0f); + //gGL.setLineWidth(1.0f); } glPolygonOffset(0.f, 0.f); @@ -5136,7 +5151,7 @@ void LLPipeline::renderDebug() } /*gGL.flush(); - glLineWidth(16-i*2); + gGL.setLineWidth(16-i*2); for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { @@ -5154,7 +5169,7 @@ void LLPipeline::renderDebug() } } gGL.flush(); - glLineWidth(1.f);*/ + gGL.setLineWidth(1.f);*/ } } @@ -9812,7 +9827,7 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) { - S32 channel = shader.disableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP); + S32 channel = shader.disableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); if (channel > -1 && mReflectionMapManager.mTexture.notNull()) { mReflectionMapManager.mTexture->unbind(); diff --git a/indra/newview/res/have_artwork_bundle.marker b/indra/newview/res/have_artwork_bundle.marker index 1dbb238d53..1dbb238d53 100755..100644 --- a/indra/newview/res/have_artwork_bundle.marker +++ b/indra/newview/res/have_artwork_bundle.marker diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index b88390d78c..b88390d78c 100755..100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc diff --git a/indra/newview/secondlife-i686.supp b/indra/newview/secondlife-i686.supp index 863c8364ab..863c8364ab 100755..100644 --- a/indra/newview/secondlife-i686.supp +++ b/indra/newview/secondlife-i686.supp diff --git a/indra/newview/skins/default/textures/icons/Inv_Script_Luau.png b/indra/newview/skins/default/textures/icons/Inv_Script_Luau.png Binary files differnew file mode 100644 index 0000000000..5666193fab --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Script_Luau.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 5699174f4f..8f6abf67a0 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -143,7 +143,6 @@ with the same filename but different name <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" /> @@ -335,6 +334,7 @@ with the same filename but different name <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_Script_Luau" file_name="icons/Inv_Script_Luau.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" /> diff --git a/indra/newview/skins/default/textures/toolbar_icons/howto.png b/indra/newview/skins/default/textures/toolbar_icons/howto.png Binary files differdeleted file mode 100644 index 8594d71113..0000000000 --- a/indra/newview/skins/default/textures/toolbar_icons/howto.png +++ /dev/null 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 71c16e8414..1bd7f3228d 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_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png Binary files differindex 715b401ce5..c0566912e3 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.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 e9f15dbad4..f00c18d1a8 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_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png Binary files differindex 753c38bdad..da419b94ea 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/xui/da/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml index 0cc13fd736..c6a78fff4e 100644 --- a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: NYT SCRIPT"> <floater.string name="not_allowed"> - Du kan ikke se eller redigere dette script, da det er sat til "no copy". Du skal bruge fulde rettigheder for at kunne se og redigere et script i dette objekt. + Du kan ikke se eller redigere dette script, da det er sat til "no copy" eller "no modify". Du skal have disse tilladelser for at kunne se eller redigere et script. </floater.string> <floater.string name="script_running"> Kører diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml index 7be9a9d555..981c35800f 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml @@ -45,4 +45,12 @@ <combo_box.item label="Installér automatisk" name="Install_automatically"/> <combo_box.item label="Hent og installér opdateringer manuelt" name="Install_manual"/> </combo_box> + <text name="os_hibernation_mode"> + Forhindr OS i at gå i dvale, hvis du ikke er væk: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Forhindrer kun OS i at gå i dvale, hvis brugeren ikke er væk"> + <combo_box.item label="Kan gå i dvale" name="can_hibernate"/> + <combo_box.item label="Kan ikke gå i dvale, kan slukke skærmen" name="cant_hibernate"/> + <combo_box.item label="Kan ikke gå i dvale, kan ikke slukke skærmen" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml index 3dec4bf101..ae073300b1 100644 --- a/indra/newview/skins/default/xui/da/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml @@ -4,7 +4,7 @@ Henter... </panel.string> <panel.string name="can_not_view"> - Du kan ikke se eller rette dette script, da det er sat til "no copy". Du skal have fulde rettigheder for at se eller rette et script i et objekt. + Du kan ikke se eller redigere dette script, da det er sat til "no copy" eller "no modify". Du skal have disse tilladelser for at kunne se eller redigere et script. </panel.string> <panel.string name="public_objects_can_not_run"> Offentlige objekter kan ikke afvikle scripts diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 320db7f654..1d56e218eb 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -23,6 +23,8 @@ mit Open-Source-Beiträgen von:</text> Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW). jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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. diff --git a/indra/newview/skins/default/xui/de/floater_how_to.xml b/indra/newview/skins/default/xui/de/floater_how_to.xml deleted file mode 100644 index caea221f83..0000000000 --- a/indra/newview/skins/default/xui/de/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="INFOS"/> diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml index ae2dd4db67..5b44c44b28 100644 --- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> <floater.string name="not_allowed"> - Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" oder „keine Änderungen" festgelegt wurde. Um ein Skript anzuzeigen oder zu bearbeiten, benötigen Sie diese Berechtigungen. </floater.string> <floater.string name="script_running"> Läuft diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 6ad71e0ad1..40b34d99ba 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -1127,7 +1127,6 @@ Falls Sie [SECOND_LIFE] zum ersten Mal verwenden, müssen Sie zuerst ein Konto e Ihr Avatar erscheint jeden Moment. Benutzen Sie die Pfeiltasten, um sich fortzubewegen. -Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE]. Bitte wählen Sie einen männlichen oder weiblichen Avatar. Sie können sich später noch umentscheiden. <usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml index a8509cabac..ef7ac09dba 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Proxy-Einstellungen: </text> <button label="Proxy-Einstellungen ändern" label_selected="Durchsuchen" name="set_proxy" width="160"/> + <text name="os_hibernation_mode"> + OS-Ruhezustand verhindern, wenn nicht abwesend: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Verhindert den OS-Ruhezustand nur, wenn der Benutzer nicht abwesend ist"> + <combo_box.item label="Ruhezustand möglich" name="can_hibernate"/> + <combo_box.item label="Kein Ruhezustand, Bildschirm kann ausgeschaltet werden" name="cant_hibernate"/> + <combo_box.item label="Kein Ruhezustand, Bildschirm kann nicht ausgeschaltet werden" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml index 8975cd40f8..f4ecfd23d6 100644 --- a/indra/newview/skins/default/xui/de/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml @@ -4,7 +4,7 @@ Wird geladen... </panel.string> <panel.string name="can_not_view"> - Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" oder „keine Änderungen" festgelegt wurde. Um ein Skript anzuzeigen oder zu bearbeiten, benötigen Sie diese Berechtigungen. </panel.string> <panel.string name="public_objects_can_not_run"> Öffentliche Objekte können keine Skripts ausführen 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 3570ccacd2..78f1db943b 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -41,7 +41,7 @@ <text name="LabelItemDescTitle"> Beschreibung: </text> - <line_editor name="LabelItemDesc" tool_tip="Bei Auswahl der Option "Mauszeiger-Tipps zu allen Objekten" in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/> + <text_editor name="LabelItemDesc" tool_tip="Bei Auswahl der Option "Mauszeiger-Tipps zu allen Objekten" in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/> <text name="LabelCreatorTitle"> Ersteller: </text> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index a17eb22d89..7647065b79 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -5537,9 +5537,6 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Command_Grid_Status_Label"> Grid-Status </string> - <string name="Command_HowTo_Label"> - Infos - </string> <string name="Command_Inventory_Label"> Inventar </string> @@ -5636,9 +5633,6 @@ Setzen Sie den Editorpfad in Anführungszeichen <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> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index bfe1477fa0..903f2f5e07 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -221,6 +221,8 @@ llphysicsextensions_tpv Copyright (c) 2010, Linden Research, Inc. Megapahit Copyright (c) 2023-2026 Megapahit. +luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine ogg/vorbis Copyright (C) 2002, Xiphophorus 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 ffb9c0f78e..ebb05c23a5 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -247,23 +247,6 @@ width="360"> TestString PleaseIgnore </text> - <button - follows="right" - height="23" - image_pressed="Info_Press" - image_unselected="Info_Over" - left_pad="3" - name="info_btn" - top_delta="-2" - width="16" /> - <!-- <button - follows="left|top" - height="23" - label="Profile" - layout="topleft" - left_pad="4" - name="Profile..." - width="90" />--> <text type="string" length="1" @@ -272,11 +255,10 @@ layout="topleft" left="10" name="Group:" - top_pad="7" + top_pad="13" width="100"> Group: </text> - <!--TODO: HOOK UP GROUP ICON--> <text follows="left|top" height="16" @@ -287,15 +269,6 @@ width="240"> TestString PleaseIgnore </text> - <button - follows="right" - height="23" - image_pressed="Info_Press" - image_unselected="Info_Over" - left_pad="3" - name="info_btn" - top_delta="-2" - width="16" /> <button follows="left|top" height="23" @@ -305,7 +278,7 @@ right="-154" name="Set..." width="90" - top_delta="-2"/> + top_delta="-5"/> <check_box enabled="false" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 397b66fbd2..d937860f53 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_minimize="false" - height="380" + height="460" layout="topleft" name="ColorPicker" help_topic="colorpicker" @@ -153,6 +153,41 @@ name="lspin" top_delta="0" width="50" /> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + top_pad="6" + left="10" + mouse_opaque="false" + name="hex_text" + width="413"> + Hex: + </text> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="60" + name="hash_text" + top_pad="-20" + width="20"> + # + </text> + <line_editor + font="SansSerif" + max_length_bytes="16" + top_pad="-22" + follows="left" + height="20" + layout="topleft" + left_delta="13" + name="hex_color" + width="50" /> <check_box follows="left|bottom" height="20" @@ -160,7 +195,7 @@ layout="topleft" left="10" name="apply_immediate" - top_pad="185" + top_pad="240" width="100" /> <button follows="left|bottom" @@ -168,19 +203,52 @@ image_selected="eye_button_active.tga" image_unselected="eye_button_inactive.tga" layout="topleft" - left_pad="50" + left_pad="0" name="color_pipette" width="28" /> + <combo_box + control_name="CopyColorDestination" + follows="right|bottom" + layout="topleft" + right="-197" + top_delta="8" + name="copy_color_combobox" + width="84"> + <combo_box.item + label="Copy as..." + name="copy_as" + value="0" /> + <combo_box.item + label="LSL" + name="lsl_color" + value="1" /> + <combo_box.item + label="HEX" + name="hex_color" + value="2" /> + <combo_box.item + label="RGB" + name="rgb_color" + value="3" /> + <combo_box.item + label="HSL" + name="hsl_color" + value="4" /> + <combo_box.item + label="CMYK" + name="cmyk_color" + value="5" /> + </combo_box> <button follows="right|bottom" height="23" label="OK" label_selected="OK" layout="topleft" - right="-120" - top_delta="9" + right="-100" + top_delta="0" name="select_btn" - width="100" /> + width="80" /> <button follows="right|bottom" height="23" @@ -190,7 +258,7 @@ left_pad="5" right="-10" name="cancel_btn" - width="100" /> + width="80" /> <text type="string" length="1" @@ -199,7 +267,7 @@ layout="topleft" left="10" name="Current color:" - top="172" + top="194" width="110"> Current color: </text> @@ -211,7 +279,7 @@ layout="topleft" left="10" name="(Drag below to save.)" - top_pad="66" + top_pad="62" width="130" wrap="true"> (Drag below to save) diff --git a/indra/newview/skins/default/xui/en/floater_create_landmark.xml b/indra/newview/skins/default/xui/en/floater_create_landmark.xml index 6d3da72962..343325c124 100644 --- a/indra/newview/skins/default/xui/en/floater_create_landmark.xml +++ b/indra/newview/skins/default/xui/en/floater_create_landmark.xml @@ -87,7 +87,7 @@ name="notes_editor" spellcheck="true" text_readonly_color="white" - prevalidator="ascii" + prevalidator="ascii_with_newline_no_pipe" commit_on_focus_lost="true" top_pad="5" width="290" diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml index b911e9b6f5..ea37b45e1e 100644 --- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml +++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml @@ -622,11 +622,13 @@ <button follows="top|left" height="23" + image_selected="SegmentedBtn_Left_Selected" + image_unselected="SegmentedBtn_Left_Off" label="Save" left="200" top_pad="0" name="save_btn" - width="156" /> + width="134" /> <button follows="top|left" @@ -634,14 +636,11 @@ name="btn_flyout" label="" layout="topleft" - left_pad="-20" + left_pad="0" top="0" - image_selected="SegmentedBtn_Right_Selected_Press" - image_unselected="SegmentedBtn_Right_Off" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Selected_Press" - image_overlay="Arrow_Small_Up" - width="20"/> + image_selected="ComboButton_Selected" + image_unselected="ComboButton_Off" + width="22"/> <button follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_gesture_autocomplete_picker.xml b/indra/newview/skins/default/xui/en/floater_gesture_autocomplete_picker.xml new file mode 100644 index 0000000000..cc4a3133cb --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_gesture_autocomplete_picker.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + name="gesture_autocomplete_picker" + title="CHOOSE GESTURE" + single_instance="true" + can_minimize="false" + can_tear_off="false" + can_resize="true" + auto_close="true" + layout="topleft" + min_width="250" + chrome="true" + sound_flags="0" + height="136" + width="340"> + <floater.string + name="showing_count"> + Showing [COUNT] of [TOTAL] + </floater.string> + <scroll_list + follows="all" + height="130" + width="336" + layout="topleft" + left="3" + top="3" + name="gesture_list" + draw_heading="false" + multi_select="false"> + <scroll_list.columns + name="trigger" + label="Trigger" + width="128" /> + <scroll_list.columns + name="name" + label="Gesture" + dynamic_width="true" /> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_how_to.xml b/indra/newview/skins/default/xui/en/floater_how_to.xml deleted file mode 100644 index 5b00d23faa..0000000000 --- a/indra/newview/skins/default/xui/en/floater_how_to.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater - legacy_header_height="18" - can_resize="false" - can_minimize="false" - height="525" - layout="topleft" - name="floater_how_to" - single_instance="true" - save_visibility="true" - save_rect="true" - title="WELCOME ISLAND GUIDEBOOK" - width="310" - rel_x="-0.469309" - rel_y="-0.011166" - filename="floater_web_content.xml"/> 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 5dd3dfa2bf..7bad20b378 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml @@ -265,10 +265,10 @@ layout="topleft" left_pad="12" top_delta="2" - name="single_folder_txt" + name="avatar_attachment_action" text_color="White" - width="300"> - Pressing enter on an avatar attachment + width="380"> + Pressing enter or double clicking on an avatar attachment </text> <combo_box control_name="InventoryAddAttachmentBehavior" diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml index e30c519c8a..9b14eade96 100644 --- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml @@ -7,7 +7,7 @@ height="607" layout="topleft" min_height="271" - min_width="328" + min_width="500" name="script ed float" help_topic="script_ed_float" save_rect="true" @@ -15,7 +15,7 @@ width="508"> <floater.string name="not_allowed"> - You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. + You can not view or edit this script, since it has been set as "no copy" or "no modify". You need these permissions to view or edit a script. </floater.string> <floater.string name="script_running"> @@ -62,7 +62,6 @@ </text> <panel bevel_style="none" - border_style="line" follows="left|top|right|bottom" height="499" @@ -93,25 +92,15 @@ name="running" width="205" /> <check_box - left_delta="140" - enabled="true" - follows="left|bottom" - font="SansSerif" - height="18" - initial_value="true" - label="Mono" + width="130" + height="21" + enabled="false" + left="9" + top_pad="10" layout="topleft" - name="mono" - width="100" /> - <check_box width="130" - height="21" - enabled="false" - left="9" - top_pad="10" - layout="topleft" - follows="bottom|left" - label="Use Experience:" - name="enable_xp"/> + follows="bottom|left" + label="Use Experience:" + name="enable_xp"/> <combo_box label="" top_pad="-21" @@ -121,13 +110,14 @@ follows="left|bottom|right" visible="false" name="Experiences..."/> - <button label=">" - name="view_profile" - height="23" - width="23" - right="496" - layout="topleft" - top_pad="-23" - follows="right" - visible="false"/> + <button + label=">" + name="view_profile" + height="23" + width="23" + right="496" + layout="topleft" + top_pad="-23" + follows="right" + visible="false"/> </floater> 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 709fbdd27e..e68c00a8d4 100644 --- a/indra/newview/skins/default/xui/en/floater_object_weights.xml +++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml @@ -2,14 +2,14 @@ <floater can_close="true" can_tear_off="false" - height="372" + height="479" help_topic="object_weights" layout="topleft" name="object_weights" save_rect="true" single_instance="true" title="ADVANCED" - width="200"> + width="205"> <floater.string name="nothing_selected" value="--"/> @@ -48,7 +48,7 @@ name="objects" top_pad="3" value="--" - width="40" /> + width="45" /> <text follows="left|top" height="16" @@ -67,7 +67,7 @@ name="prims" top_pad="3" value="--" - width="40" /> + width="45" /> <text follows="left|top" height="16" @@ -85,7 +85,7 @@ left="10" name="selected_text_border" top_pad="5" - width="180"/> + width="185"/> <text @@ -107,7 +107,7 @@ name="download" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -134,7 +134,7 @@ name="physics" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -161,7 +161,7 @@ name="server" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -188,7 +188,7 @@ name="display" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -214,7 +214,7 @@ left="10" name="weights_text_border" top_pad="5" - width="180"/> + width="185"/> <text @@ -236,7 +236,7 @@ name="selected" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -263,7 +263,7 @@ name="rezzed_on_land" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -290,7 +290,7 @@ name="remaining_capacity" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -317,7 +317,7 @@ name="total_capacity" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -336,6 +336,15 @@ value="Total capacity" width="130" /> + <view_border + bevel_style="none" + follows="top|left" + height="0" + layout="topleft" + left="10" + name="rendering_text_border" + top_pad="5" + width="185"/> <text follows="left|top" @@ -356,7 +365,7 @@ name="lod_level" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -383,7 +392,7 @@ name="triangles_shown" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -410,7 +419,7 @@ name="pixel_area" top_pad="3" value="--" - width="40" /> + width="45" /> <loading_indicator follows="left|top" height="16" @@ -428,4 +437,133 @@ top_delta="0" value="Pixel Area" width="130" /> + + <view_border + bevel_style="none" + follows="top|left" + height="0" + layout="topleft" + left="10" + name="lods_text_border" + top_pad="5" + width="185"/> + + <text + follows="left|top" + height="16" + layout="topleft" + left="10" + name="lod_info_text" + text_color="EmphasisColor" + top_pad="10" + value="LOD INFO" + width="180" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="high_lod_tris" + top_pad="3" + value="--" + width="45" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="high_lod_tris_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="high_lod_tris_label" + top_delta="0" + value="High triangles" + width="130" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="medium_lod_tris" + top_pad="3" + value="--" + width="45" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="medium_lod_tris_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="medium_lod_tris_label" + top_delta="0" + value="Medium triangles" + width="130" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="low_lod_tris" + top_pad="3" + value="--" + width="45" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="low_lod_tris_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="low_lod_tris_label" + top_delta="0" + value="Low triangles" + width="130" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="lowest_lod_tris" + top_pad="3" + value="--" + width="45" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="lowest_lod_tris_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="lowest_lod_tris_label" + top_delta="0" + value="Lowest triangles" + 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 af3403d034..5345d5a529 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -117,6 +117,12 @@ help_topic="preferences_audio_tab" name="audio" /> <panel + class="panel_preference" + filename="panel_preferences_voice.xml" + label="Voice" + layout="topleft" + name="voice" /> + <panel class="panel_preference" filename="panel_preferences_chat.xml" label="Chat" 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 672db51ff6..2c8418298b 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 @@ -76,19 +76,19 @@ height="16" increment="1" initial_value="8" - label="Post process quality:" + label="Glow quality:" label_width="185" layout="topleft" left="30" min_val="8" max_val="9" - name="RenderPostProcess" + name="GlowResolution" show_text="false" top_delta="16" width="300"> <slider.commit_callback function="Pref.UpdateSliderText" - parameter="PostProcessText" /> + parameter="GlowResolutionText" /> </slider> <text type="string" @@ -96,7 +96,7 @@ follows="left|top" height="16" layout="topleft" - name="PostProcessText" + name="GlowResolutionText" top_delta="0" left_delta="304" width="65"> @@ -360,17 +360,6 @@ Hardware </text> - - <check_box - control_name="RenderAnisotropic" - height="16" - label="Anisotropic Filtering (slower when enabled)" - layout="topleft" - left="30" - name="ani" - top_delta="16" - width="256" /> - <check_box control_name="RenderCompressTextures" height="16" @@ -401,6 +390,49 @@ height="20" layout="topleft" left="30" + name="af strength label" + top_delta="20" + width="130"> + Anisotropic Filtering: + </text> + <combo_box + control_name="RenderAnisotropicLevel" + height="20" + label="Anisotropic Filtering" + layout="topleft" + left_pad="40" + name="anisotropic_filter" + top_delta="0" + width="90"> + <combo_box.item + label="Disabled" + name="disabled" + value="0" /> + <combo_box.item + label="2x" + name="2x" + value="2" /> + <combo_box.item + label="4x" + name="4x" + value="4" /> + <combo_box.item + label="8x" + name="8x" + value="8" /> + <combo_box.item + label="16x" + name="16x" + value="16" /> + </combo_box> + + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="30" name="antialiasing label" top_delta="20" width="130"> @@ -657,25 +689,25 @@ </check_box> <slider - control_name="WLSkyDetail" + control_name="RenderHighPrecisionPostProcess" decimal_digits="0" follows="left|top" height="16" - increment="8" + increment="1" initial_value="160" - label="Sky:" + label="Post Process Quality:" label_width="164" layout="topleft" left="420" - min_val="16" - max_val="128" - name="SkyMeshDetail" + min_val="0" + max_val="1" + name="RenderPostProcess" show_text="false" top_delta="22" width="260"> <slider.commit_callback function="Pref.UpdateSliderText" - parameter="SkyMeshDetailText" /> + parameter="PostProcessText" /> </slider> <text type="string" @@ -684,7 +716,7 @@ height="16" layout="topleft" left_delta="264" - name="SkyMeshDetailText" + name="PostProcessText" text_readonly_color="LabelDisabledColor" top_delta="0" width="65"> diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml index b0b105fe58..f82224cc9e 100644 --- a/indra/newview/skins/default/xui/en/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml @@ -5,7 +5,7 @@ height="593" layout="topleft" min_height="271" - min_width="320" + min_width="500" name="preview lsl text" help_topic="preview_lsl_text" save_rect="true" diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml index a98437ab1d..181d08c67b 100644 --- a/indra/newview/skins/default/xui/en/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml @@ -37,6 +37,10 @@ name="LoadingObjInv"> Loading inventory for: [OBJECT_NAME] </floater.string> + <floater.string + name="SkippingIncompatibleScript"> + Skipping script "[SCRIPT_NAME]" (cannot recompile to [TARGET]) + </floater.string> <button follows="right|bottom" height="24" diff --git a/indra/newview/skins/default/xui/en/floater_scripting_settings.xml b/indra/newview/skins/default/xui/en/floater_scripting_settings.xml new file mode 100644 index 0000000000..093c3f1d6b --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_scripting_settings.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + legacy_header_height="18" + height="295" + layout="topleft" + name="floater_scripting_settings" + help_topic="scripting_settings" + save_rect="true" + title="SCRIPT DEVELOPMENT SETTINGS" + width="485"> + <check_box + control_name="ShowScriptErrors" + follows="left|top" + height="20" + label="Show script errors in:" + layout="topleft" + left="30" + top_pad="20" + name="show_script_errors" + width="256" /> + <radio_group + enabled_control="ShowScriptErrors" + control_name="ShowScriptErrorsLocation" + follows="top|left" + height="16" + layout="topleft" + left_delta="50" + name="show_location" + top_pad="5" + width="364"> + <radio_item + height="16" + label="Nearby chat" + layout="topleft" + left="3" + name="0" + top="0" + width="315" /> + <radio_item + height="16" + label="Separate window" + layout="topleft" + left_delta="175" + name="1" + top_delta="0" + width="315" /> + </radio_group> + + <text + follows="top|left|right" + height="15" + layout="topleft" + left="30" + name="tip" + top_pad="20" + width="330" + wrap="true"> + External Script Editor: + </text> + <line_editor + control_name="ExternalEditor" + follows="top|left" + height="20" + initial_value="" + layout="left" + left_pad="5" + name="external_editor" + top_delta="25" + value="" + width="360" /> + <button + follows="left|top" + height="20" + label="Browse..." + layout="topleft" + left_pad="5" + name="browse_btn" + top_delta="0" + width="70"> + <button.commit_callback + function="ScriptingSettings.BROWSE" /> + </button> + + <check_box + control_name="ExternalEditorTightIntegration" + follows="top|left" + height="20" + label="VS Code Tight Integration" + layout="topleft" + left="30" + name="tight_integration" + top_pad="20" + width="256" /> + + <check_box + control_name="ExternalWebsocketSyncEnable" + follows="top|left" + height="20" + label="Enable WebSocket Sync" + layout="topleft" + left="30" + name="websocket_sync_enable" + top_pad="10" + width="200" /> + + <text + enabled_control="ExternalWebsocketSyncEnable" + follows="top|left" + height="15" + layout="topleft" + left="50" + name="websocket_tip" + top_pad="10" + width="140" + wrap="false"> + WebSocket Listen Port: + </text> + <line_editor + enabled_control="ExternalWebsocketSyncEnable" + control_name="ExternalWebsocketSyncPort" + follows="top|left" + height="20" + initial_value="9020" + layout="topleft" + left_pad="5" + name="websocket_port" + top_delta="-2" + value="9020" + width="120" /> + <check_box + control_name="ExternalWebsocketForwardDebug" + enabled_control="ExternalWebsocketSyncEnable" + follows="top|left" + height="20" + label="Forward script errors and debug to WebSocket clients" + layout="topleft" + left="50" + name="websocket_forward_debug" + top_pad="5" + width="400" /> + + <button + follows="left|top" + height="23" + label="Close" + layout="topleft" + right="-10" + name="close_btn" + top="-30" + width="100"> + <button.commit_callback + function="ScriptingSettings.CLOSE" /> + </button> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index acdccdc03a..7f1a59217f 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -226,7 +226,6 @@ Filter: </text> <combo_box - control_name="PhotoFilters" follows="left|right|top" name="filters_combobox" tool_tip="Image filters" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index e4dab5b7ac..4c11e68214 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1559,9 +1559,7 @@ even though the user gets a free copy. left_delta="0" name="object_horizontal" top_pad="10" - width="95" - font="DejaVu" - font.size="LSmall" /> + width="95" /> <menu_button menu_filename="menu_copy_paste_pos.xml" follows="top|left" @@ -2651,9 +2649,7 @@ even though the user gets a free copy. left="8" name="object_horizontal" top_pad="10" - width="278" - font="DejaVu" - font.size="LSmall" /> + width="278" /> <check_box height="16" label="Light" @@ -3058,35 +3054,56 @@ even though the user gets a free copy. name="Contents" top_delta="0" width="295"> - <button + <flyout_button follows="left|top" height="23" label="New Script" - label_selected="New Script" layout="topleft" - left="8" + left="7" name="button new script" top="10" - width="134" - font="DejaVu" - font.size="LSmall" - pad_bottom="1" /> + width="137"> + <flyout_button.item + label="New LSL Script" + name="new_lsl_script" + value="lsl" /> + <flyout_button.item + label="New Lua Script" + name="new_lua_script" + value="lua" /> + </flyout_button> + <button + follows="left|top" + height="23" + label="New Notecard" + layout="topleft" + left_pad="7" + name="button new notecard" + width="137" /> <button follows="left|top" height="23" label="Permissions" layout="topleft" - left_pad="8" + left="7" + top="37" name="button permissions" - width="134" - font="DejaVu" - font.size="LSmall" - pad_bottom="1" /> + width="137" /> + <button + follows="left|top" + height="23" + is_toggle="true" + label="Explore in IDE" + label_selected="Stop Exploring" + layout="topleft" + left_pad="7" + name="button publish" + width="137" /> <filter_editor follows="left|top|right" label="Enter filter text" layout="topleft" - top="40" + top="67" left="10" text_pad_left="10" max_length_chars="300" @@ -3099,11 +3116,11 @@ even though the user gets a free copy. border_visible="true" bevel_style="in" follows="left|top|right" - height="367" + height="340" layout="topleft" left="10" name="contents_inventory" - top="70" + top="97" width="275" /> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml index 22dbd80cda..d1df8bf80f 100644 --- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -228,7 +228,7 @@ height="20" layout="topleft" left_pad="10" - max_length_chars="50" + max_length_chars="100" top_delta="-4" name="azure_api_key" width="210" /> 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 6535a9a079..f0e8bd0c61 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -637,7 +637,6 @@ Location: </text> <spinner - control_name="Teleport_Coordinate_X" decimal_digits="0" follows="right|bottom" height="23" @@ -653,7 +652,6 @@ function="WMap.Coordinates" /> </spinner> <spinner - control_name="Teleport_Coordinate_Y" decimal_digits="0" follows="right|bottom" height="23" @@ -669,7 +667,6 @@ function="WMap.Coordinates" /> </spinner> <spinner - control_name="Teleport_Coordinate_Z" decimal_digits="0" follows="right|bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml index 1e10a984da..38d7f09445 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation_log_view.xml @@ -35,8 +35,8 @@ parameter="sort_friends_on_top" /> </menu_item_check> <menu_item_check - label="Show muted" - name="show_muted"> + label="Show blocked" + name="show_blocked"> <on_click function="CallLog.Action" parameter="show_blocked" /> 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 fb68193006..fb68193006 100755..100644 --- a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 5fff9b7bc0..ec6be3e0c6 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -57,15 +57,6 @@ tear_off="true" name="Help"> <menu_item_call - label="Guidebook" - name="How To" - shortcut="F1"> - <menu_item_call.on_click - function="Help.ToggleHowTo" - parameter="" /> - </menu_item_call> - <menu_item_separator/> - <menu_item_call label="Knowledge Base" name="Knowledge Base"> <menu_item_call.on_click @@ -107,7 +98,14 @@ name="Report Bug"> <menu_item_call.on_click function="Advanced.ReportBug"/> - </menu_item_call> + </menu_item_call> + <menu_item_call + label="Set UI Size to Default" + name="Set UI Size to Default" + shortcut="control|alt|shift|R"> + <menu_item_call.on_click + function="View.DefaultUISize" /> + </menu_item_call> <menu_item_separator/> <menu_item_call label="About [APP_NAME]" 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 d43ce26e56..bf445b0d18 100644 --- a/indra/newview/skins/default/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml @@ -28,6 +28,14 @@ parameter="not_blocked" /> </menu_item_call> <menu_item_call + label="Report Abuse..." + layout="topleft" + name="Report Abuse"> + <menu_item_call.on_click + function="ObjectIcon.Action" + parameter="report_abuse" /> + </menu_item_call> + <menu_item_call label="Unblock" layout="topleft" name="Unblock"> 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 fb6081e1fb..f72d2fdd66 100644 --- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml @@ -23,6 +23,13 @@ <menu_item_call.on_click function="Url.Unblock" /> </menu_item_call> + <menu_item_call + label="Report Abuse..." + layout="topleft" + name="Report Abuse"> + <menu_item_call.on_click + function="Url.ReportAbuseObj" /> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 2272389125..a6dc96ff2c 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -51,6 +51,13 @@ function="Tools.Link"/> </menu_item_call> <menu_item_call + label="Visited places..." + name="Visited Places" + shortcut="control|shift|L"> + <menu_item_call.on_click + function="Tools.Unlink"/> + </menu_item_call> + <menu_item_call label="Picks..." name="Picks"> <menu_item_call.on_click @@ -1041,6 +1048,17 @@ parameter="region" /> </menu_item_check> <menu_item_separator/> + <menu_item_check + label="Switch to Shared after teleport" + name="Switch to Shared after teleport"> + <menu_item_check.on_click + function="ToggleControl" + parameter="SwitchToSharedEnvAfterTeleport" /> + <menu_item_check.on_check + function="CheckControl" + parameter="SwitchToSharedEnvAfterTeleport" /> + </menu_item_check> + <menu_item_separator/> <menu_item_call label="My Environments..." name="my_environs"> @@ -1068,7 +1086,15 @@ parameter="pause_clouds" /> </menu_item_check> </menu> - + <menu_item_check + label="Mute/unmute sound" + name="toggle_sound" + shortcut="control|alt|shift|M"> + <menu_item_check.on_click + function="World.ToggleMasterAudio"/> + <menu_item_check.on_check + function="World.IsMasterAudioMuted"/> + </menu_item_check> <!-- <menu create_jump_keys="true" @@ -1404,6 +1430,24 @@ function="World.EnvPreset" function="EditableSelected" /> </menu_item_call> <menu_item_call + label="Recompile Scripts (Lua)" + name="Lua"> + <menu_item_call.on_click + function="Tools.SelectedScriptAction" + parameter="compile lua" /> + <menu_item_call.on_enable + function="EditableSelectedLua" /> + </menu_item_call> + <menu_item_call + label="Recompile Scripts (LSL on Luau)" + name="LSL on Luau"> + <menu_item_call.on_click + function="Tools.SelectedScriptAction" + parameter="compile lsl-luau" /> + <menu_item_call.on_enable + function="EditableSelectedLua" /> + </menu_item_call> + <menu_item_call label="Reset Scripts" name="Reset Scripts"> <menu_item_call.on_click @@ -1422,14 +1466,25 @@ function="World.EnvPreset" function="EditableSelected" /> </menu_item_call> <menu_item_call - label="Set Scripts to Not Running" - name="Set Scripts to Not Running"> + label="Set Scripts to Not Running" + name="Set Scripts to Not Running"> <menu_item_call.on_click - function="Tools.SelectedScriptAction" - parameter="stop" /> + function="Tools.SelectedScriptAction" + parameter="stop" /> <menu_item_call.on_enable - function="EditableSelected" /> + function="EditableSelected" /> </menu_item_call> + <menu_item_separator/> + <menu_item_check + label="Script Editor Server" + name="Script Editor Server"> + <menu_item_check.on_check + function="Tools.CheckScriptEditorServer" /> + <menu_item_check.on_click + function="Tools.ToggleScriptEditorServer" /> + <menu_item_check.on_enable + function="Tools.EnableScriptEditorServer" /> + </menu_item_check> </menu> <menu @@ -1842,14 +1897,6 @@ function="World.EnvPreset" label="Help" name="Help" tear_off="true"> - <menu_item_call - label="Guidebook" - name="How To" - shortcut="F1"> - <menu_item_call.on_click - function="Help.ToggleHowTo" - parameter="" /> - </menu_item_call> <!-- <menu_item_call label="Tutorial" name="Tutorial"> @@ -1857,7 +1904,6 @@ function="World.EnvPreset" function="Floater.Show" parameter="hud" /> </menu_item_call>--> - <menu_item_separator/> <menu_item_call label="Knowledge Base" name="Knowledge Base"> @@ -3621,6 +3667,16 @@ function="World.EnvPreset" function="ToggleControl" parameter="CollectFontVertexBuffers" /> </menu_item_check> + <menu_item_check + label="Collect UI Image Vertex Buffers" + name="Collect UI Image Vertex Buffers"> + <menu_item_check.on_check + function="CheckControl" + parameter="CollectUIImageVertexBuffers" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="CollectUIImageVertexBuffers" /> + </menu_item_check> <menu_item_separator /> <menu_item_check label="Enable Shader Cache" diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index e5c33809c8..28e63c82f1 100644 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -130,7 +130,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </scheme> <mimetype name="blank"> @@ -163,7 +163,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="video/*"> @@ -174,7 +174,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="image/*"> @@ -196,7 +196,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="application/javascript"> @@ -218,7 +218,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="application/pdf"> @@ -295,7 +295,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="audio/mpeg"> @@ -306,7 +306,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="audio/x-aiff"> @@ -317,7 +317,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="audio/x-wav"> @@ -328,7 +328,7 @@ audio </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype menu="1" name="image/bmp"> @@ -438,7 +438,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="video/mp4"> @@ -449,7 +449,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype menu="1" name="video/quicktime"> @@ -460,7 +460,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="video/x-ms-asf"> @@ -471,7 +471,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype name="video/x-ms-wmv"> @@ -482,7 +482,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> <mimetype menu="1" name="video/x-msvideo"> @@ -493,7 +493,7 @@ movie </widgettype> <impl> - media_plugin_libvlc + media_plugin_gstreamer10 </impl> </mimetype> </mimetypes> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 65f26d50e7..68a8712ee1 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -425,6 +425,17 @@ Initialization with the Marketplace failed because of a system or network error. </notification> <notification + icon="alertmodal.tga" + name="CannotPasteFolderIntoSelf" + type="alertmodal"> + You cannot paste a folder into itself or into one of its subfolders. + <tag>fail</tag> + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification icon="notifytip.tga" name="InvalidKeystroke" type="notifytip"> @@ -3950,7 +3961,6 @@ Local Data you are deleting is shared between multiple grids, are you sure you w Your character will appear in a moment. Use arrow keys to walk. -Press the F1 key at any time for help or to learn more about [SECOND_LIFE]. Please choose the male or female avatar. You can change your mind later. <usetemplate name="okcancelbuttons" @@ -6756,6 +6766,14 @@ Your trash is overflowing. This may cause problems logging in. </notification> <notification + icon="notifytip.tga" + name="InventoryLimitReachedAIS" + type="notifytip"> +Your inventory is experiencing issues. Please, contact support. + <tag>fail</tag> + </notification> + + <notification icon="alertmodal.tga" name="InventoryLimitReachedAISAlert" type="alertmodal"> @@ -7068,6 +7086,27 @@ The string [STRING_NAME] is missing from strings.xml type="notifytip"> [MESSAGE] </notification> + + <notification + icon="notifytip.tga" + name="ExternalEditorServerStarted" + type="notifytip"> +External editor server started on port [PORT]. + </notification> + + <notification + icon="notifytip.tga" + name="ExternalEditorServerFailed" + type="notifytip"> +Failed to start external editor server on port [PORT]. + </notification> + + <notification + icon="notifytip.tga" + name="ExternalEditorServerStopped" + type="notifytip"> +External editor server stopped. + </notification> <notification icon="notifytip.tga" @@ -7690,7 +7729,7 @@ Message from [NAME]: type="notify"> <unique/> This land has damage enabled. -You can be hurt here. If you die, you will be teleported to your home location. +You can be hurt here. If you die, you might be teleported to your home location, region telehub or parcel landing point. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index 9544042e94..37867b4a0e 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -26,10 +26,12 @@ title="Clothing"> <flat_list_view allow_select="true" + allow_reorder="true" follows="all" height="10" item_pad="3" keep_selection_visible_on_reshape="true" + keep_scroll_pos="true" layout="topleft" left="0" multi_select="true" 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 868d54401e..90697d5e4b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -565,6 +565,18 @@ things in this group. There's a broad variety of Abilities. right="-1" name="role_assigned_members" top_pad="0" /> + <text + type="string" + height="125" + layout="topleft" + follows="left|top" + left="5" + name="members_not_loaded" + visible="false" + top_delta="3" + width="300"> + Members are not loaded + </text> <check_box height="15" label="Reveal members" diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml index 18dcc86649..eeb37eddcf 100644 --- a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml @@ -13,6 +13,7 @@ border="false" bevel_style="none" show_item_link_overlays="true" + preinitialize_views="false" > <scroll reserve_scroll_corner="false" /> </inbox_inventory_panel> 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 9cb64e7a13..7594b09ac2 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -336,7 +336,7 @@ read_only="true" spellcheck="true" text_readonly_color="white" - prevalidator="ascii_with_newline" + prevalidator="ascii_with_newline_no_pipe" top_pad="5" width="290" wrap="true" /> 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 d49bf19c5d..2f64ae8b65 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml @@ -17,7 +17,7 @@ You don't have any outfits yet. Try [secondlife:///app/search/all/ Search] </string> <string name="no_matched_outfits_msg"> - Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]. + No matching items. </string> <text type="string" 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 cd4e5ef1f6..c7ee3f72ca 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -24,7 +24,7 @@ width="309"> <no_matched_tabs_text name="no_matched_outfits_msg" - value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." + value="No matching items." v_pad="10"/> <no_visible_tabs_text name="no_outfits_msg" 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 86ec799996..95683810e8 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -158,43 +158,6 @@ top_pad="-14" width="250" /> <check_box - control_name="ShowScriptErrors" - follows="left|top" - height="20" - label="Show script errors in:" - layout="topleft" - left="30" - top_pad="10" - name="show_script_errors" - width="256" /> - <radio_group - enabled_control="ShowScriptErrors" - control_name="ShowScriptErrorsLocation" - follows="top|left" - height="16" - layout="topleft" - left_delta="50" - name="show_location" - top_pad="5" - width="364"> - <radio_item - height="16" - label="Nearby chat" - layout="topleft" - left="3" - name="0" - top="0" - width="315" /> - <radio_item - height="16" - label="Separate window" - layout="topleft" - left_delta="175" - name="1" - top_delta="0" - width="315" /> - </radio_group> - <check_box control_name="StreamNotificationChannelEnabled" height="16" label="Custom stream notification channel" @@ -289,9 +252,21 @@ name="default_creation_permissions" height="20" left="30" - top_pad="16" + top_pad="10" width="200"> <button.commit_callback function="Pref.PermsDefault" /> </button> + <button + follows="top|left" + layout="topleft" + label="Script Development" + name="scripting_development" + height="20" + left="30" + top_pad="10" + width="200"> + <button.commit_callback + function="Pref.Scripting" /> + </button> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 2036ed75ca..d5f2f69df7 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -246,5 +246,41 @@ <button.commit_callback function="Pref.Proxy" /> </button> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="30" + name="os_hibernation_mode" + mouse_opaque="false" + top_pad="8" + width="300"> + Prevent OS from hibernating if not Away: + </text> + <combo_box + control_name="OSHibernationMode" + follows="left|top" + height="23" + layout="topleft" + left_delta="50" + top_pad="10" + name="os_hibernation_combobox" + width="300" + tool_tip="Only prevents OS from sleeping if user is not away"> + <combo_box.item + label="Can hibernate" + name="can_hibernate" + value="0" /> + <combo_box.item + label="Can't hibernate, can turn screen off" + name="cant_hibernate" + value="1" /> + <combo_box.item + label="Can't hibernate, can't turn screen off" + name="cant_hibernate_screen" + value="2" /> + </combo_box> </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 1dcbf4e666..18fd7fe2d3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -35,7 +35,7 @@ name="System Volume" show_text="false" slider_label.halign="right" - top="10" + top="12" volume="true" width="300"> <slider.commit_callback @@ -316,7 +316,7 @@ follows="left|top" layout="topleft" left="23" - top_delta="25" + top_delta="35" name="Listen media from" height="15" width="180" @@ -346,6 +346,7 @@ layout="topleft" height="15" left="23" + top_delta="32" width="180" name="media_autoplay_label" halign="right"> @@ -379,6 +380,7 @@ layout="topleft" height="15" left="23" + top_delta="32" width="180" name="media_firstinteract_label" halign="right"> @@ -435,11 +437,12 @@ enabled_control="AudioStreamingMedia" value="true" follows="left|top" + layout="topleft" 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" + top_delta="35" height="15"/> <check_box name="media_huds_autoplay" @@ -450,171 +453,7 @@ 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" + top_delta="25" width="15" height="15"/> - <text - layout="topleft" - follows="left" - height="15" - width="187" - 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="190" - top_delta="-6" - width="130" - height="23" - name="noise_suppression_combo"> - <item - label="Off" - name="noise_suppression_none" - value="0"/> - <item - label="Low" - name="noise_suppression_low" - value="1"/> - <item - label="Moderate" - name="noise_suppression_moderate" - value="2"/> - <item - label="High" - name="noise_suppression_high" - value="3"/> - <item - label="Max" - name="noise_suppression_max" - value="4"/> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - layout="topleft" - left="23" - top_delta="30" - name="Listen from" - width="180" - height="15" - halign="right"> - Hear voice from - </text> - <combo_box - enabled_control="EnableVoiceChat" - control_name="VoiceEarLocation" - follows="left|top" - layout="topleft" - left_delta="190" - 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" - enabled_control="EnableVoiceChat" - follows="left|top" - height="15" - label="Move avatar lips when speaking" - layout="topleft" - left="20" - name="enable_lip_sync" - 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" - layout="topleft" - left="275" - name="enable_echo_cancellation" - top_pad="-15" - width="200"/> - <check_box - follows="top|left" - enabled_control="EnableVoiceChat" - control_name="PushToTalkToggle" - height="15" - label="Toggle speak on/off with toolbar button" - layout="topleft" - left="20" - name="push_to_talk_toggle_check" - width="245" - tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down." - 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" - layout="topleft" - name="voice_automatic_gain_control" - left="275" - top_pad="-15" - width="200"/> - <check_box - name="gesture_audio_play_btn" - control_name="EnableGestureSounds" - disabled_control="MuteAudio" - value="true" - follows="left|bottom|right" - height="15" - tool_tip="Check this to hear sounds from gestures" - label="Play sounds from gestures" - top_pad="5" - 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" - layout="topleft" - name="voice_dot_visualizer" - left="275" - top_pad="-15" - width="200"/> - <button - control_name="ShowDeviceSettings" - enabled_control="EnableVoiceChat" - follows="left|top" - height="23" - is_toggle="true" - label="Voice Input/Output devices" - layout="topleft" - left="20" - top_pad="1" - name="device_settings_btn" - width="200"> - </button> - <panel - layout="topleft" - filename="panel_sound_devices.xml" - visiblity_control="ShowDeviceSettings" - name="device_settings_panel" - top_pad="0" - width="480" - left="18" - class="panel_voice_device_settings"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_voice.xml b/indra/newview/skins/default/xui/en/panel_preferences_voice.xml new file mode 100644 index 0000000000..6d8e39e03c --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_voice.xml @@ -0,0 +1,222 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel + border="true" + follows="all" + height="438" + label="Voice" + layout="topleft" + left="102" + name="voice_panel" + top="1" + width="517"> + <slider + control_name="AudioLevelVoice" + disabled_control="MuteAudio" + follows="left|top" + height="16" + increment="0.025" + initial_value="0.5" + label="Voice Chat" + label_width="120" + layout="topleft" + left="0" + top="19" + name="Voice Volume" + show_text="false" + slider_label.halign="right" + volume="true" + width="300"> + <slider.commit_callback + function="Pref.setControlFalse" + parameter="MuteVoice" /> + </slider> + <button + control_name="MuteVoice" + disabled_control="MuteAudio" + follows="top|left" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + is_toggle="true" + layout="topleft" + left_pad="5" + name="mute_audio_voice" + tab_stop="false" + width="16" /> + <check_box + label_text.halign="left" + follows="left|top" + height="16" + control_name ="EnableVoiceChat" + disabled_control="CmdLineDisableVoice" + label="Enabled" + layout="topleft" + top_delta="2" + left_pad="5" + name="enable_voice_check" + width="110"/> + <text + layout="topleft" + follows="left" + height="15" + width="187" + name="noise_suppression_label" + left="23" + top_delta="42" + halign="right"> + Microphone Noise Suppression + </text> + <combo_box + control_name="VoiceNoiseSuppressionLevel" + enabled_control="EnableVoiceChat" + follows="left|top" + layout="topleft" + left_delta="190" + top_delta="-6" + width="130" + height="23" + name="noise_suppression_combo"> + <item + label="Off" + name="noise_suppression_none" + value="0"/> + <item + label="Low" + name="noise_suppression_low" + value="1"/> + <item + label="Moderate" + name="noise_suppression_moderate" + value="2"/> + <item + label="High" + name="noise_suppression_high" + value="3"/> + <item + label="Max" + name="noise_suppression_max" + value="4"/> + </combo_box> + <text + type="string" + length="1" + follows="left|top" + layout="topleft" + left="23" + top_delta="35" + name="Listen from" + width="180" + height="15" + halign="right"> + Hear voice from + </text> + <combo_box + enabled_control="EnableVoiceChat" + control_name="VoiceEarLocation" + follows="left|top" + layout="topleft" + left_delta="190" + 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" + enabled_control="EnableVoiceChat" + follows="left|top" + height="15" + label="Move avatar lips when speaking" + layout="topleft" + left="20" + name="enable_lip_sync" + top_pad="16" + width="237"/> + <check_box + follows="top|left" + enabled_control="EnableVoiceChat" + control_name="PushToTalkToggle" + height="15" + label="Toggle speak on/off with toolbar button" + layout="topleft" + left="20" + name="push_to_talk_toggle_check" + width="245" + tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down." + top_pad="9"/> + <check_box + name="gesture_audio_play_btn" + control_name="EnableGestureSounds" + disabled_control="MuteAudio" + value="true" + follows="left|bottom|right" + layout="topleft" + height="15" + tool_tip="Check this to hear sounds from gestures" + label="Play sounds from gestures" + top_pad="9" + left="20"/> + <check_box + control_name="VoiceEchoCancellation" + enabled_control="EnableVoiceChat" + height="15" + tool_tip="Check to enable voice echo cancellation" + label="Echo Cancellation" + layout="topleft" + left="20" + name="enable_echo_cancellation" + top_pad="9" + width="200"/> + <check_box + control_name="VoiceAutomaticGainControl" + enabled_control="EnableVoiceChat" + height="15" + tool_tip="Check to enable automatic gain control" + label="Automatic Gain Control" + layout="topleft" + name="voice_automatic_gain_control" + left="20" + top_pad="9" + width="200"/> + <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" + layout="topleft" + name="voice_dot_visualizer" + left="20" + top_pad="9" + width="200"/> + <button + control_name="ShowDeviceSettings" + enabled_control="EnableVoiceChat" + follows="left|top" + height="23" + is_toggle="true" + label="Voice Input/Output devices" + layout="topleft" + left="20" + top_pad="21" + name="device_settings_btn" + width="200"> + </button> + <panel + layout="topleft" + filename="panel_sound_devices.xml" + visiblity_control="ShowDeviceSettings" + name="device_settings_panel" + top_pad="0" + width="480" + left="18" + class="panel_voice_device_settings"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index f8761d2b24..1a978a7629 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -14,7 +14,7 @@ </panel.string> <panel.string name="can_not_view"> - You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. + You can not view or edit this script, since it has been set as "no copy" or "no modify". You need these permissions to view or edit a script. </panel.string> <panel.string name="public_objects_can_not_run"> @@ -219,7 +219,7 @@ label="Save" label_selected="Save" layout="topleft" - top_pad="-35" + top_pad="-23" right="487" name="Save_btn" width="81" /> @@ -233,4 +233,37 @@ right="400" name="Edit_btn" width="81" /> + <combo_box + name="compile_target" + follows="right|bottom" + height="23" + layout="topleft" + top_pad="-23" + right="300" + width="140"> + <combo_box.item + label="LSL on Mono (recommended)" + name="compile_target_mono" + value="mono" /> + <combo_box.item + label="LSL Legacy" + name="compile_target_lsl2" + value="lsl2" /> + <combo_box.item + label="LSL on Lua" + name="compile_target_lsl_luau" + value="lsl-luau" /> + <combo_box.item + label="Lua" + name="compile_target_luau" + value="luau" /> + </combo_box> + <text + name="compile_target_label" + follows="right|bottom" + layout="topleft" + top_pad="-39" + width="90"> + Compiler: + </text> </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 23bbf45e88..f39f8cb782 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 @@ -138,7 +138,9 @@ min_val_x="-30" max_val_x="30" min_val_y="-30" - max_val_y="30" + max_val_y="30" + increment_x="0.01f" + increment_y="0.01f" logarithmic="true"/> <text 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 90bdea93fa..018306826e 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -60,10 +60,22 @@ name="Large(512x512)" value="[i512,i512]" /> <combo_box.item + label="Wide (1024x512)" + name="Wide(1024x512)" + value="[i1024,i512]" /> + <combo_box.item label="Huge (1024x1024)" name="Huge(1024x1024)" value="[i1024,i1024]" /> <combo_box.item + label="Full Wide (2048x1024)" + name="Full(2048x1024)" + value="[i2048,i1024]" /> + <combo_box.item + label="Full (2048x2048)" + name="Full(2048x2048)" + value="[i2048,i2048]" /> + <combo_box.item label="Current Window" name="CurrentWindow" value="[i0,i0]" /> 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 fb88b752ae..34713673d7 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -79,6 +79,26 @@ name="2048x2048" value="[i2048,i2048]" /> <combo_box.item + label="1920x1080" + name="1920x1080" + value="[i1920,i1080]" /> + <combo_box.item + label="2560x1440" + name="2560x1440" + value="[i2560,i1440]" /> + <combo_box.item + label="3840x2160" + name="3840x2160" + value="[i3840,i2160]" /> + <combo_box.item + label="5120x2880" + name="5120x2880" + value="[i5120,i2880]" /> + <combo_box.item + label="7680x4320" + name="7680x4320" + value="[i7680,i4320]" /> + <combo_box.item label="Custom" name="Custom" value="[i-1,i-1]" /> 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 b858d0ed02..72fdf20eca 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -24,28 +24,6 @@ name="device_not_loaded"> Device not loaded </string> - <icon - follows="left|top" - height="18" - image_name="Microphone_On" - left_delta="-5" - name="microphone_icon" - mouse_opaque="false" - top="7" - layout="topleft" - visible="true" - width="18" /> - <icon - follows="left|top" - height="18" - image_name="Parcel_Voice_Dark" - layout="topleft" - left_pad="220" - name="speaker_icon" - mouse_opaque="false" - top_delta="0" - visible="true" - width="22" /> <text type="string" length="1" @@ -53,8 +31,8 @@ follows="left|top" height="16" layout="topleft" - left_pad="-240" - top_delta="5" + left="18" + top="18" name="Input" width="60"> Input @@ -64,7 +42,7 @@ control_name="VoiceInputAudioDevice" follows="left|top" layout="topleft" - left_pad="0" + left_pad="25" max_chars="128" name="voice_input_device" top_delta="-5" @@ -76,9 +54,9 @@ follows="left|top" height="15" layout="topleft" - left_pad="30" name="Output" - top_delta="5" + top_delta="35" + left="18" width="60"> Output </text> @@ -87,7 +65,7 @@ height="23" follows="left|top" layout="topleft" - left_pad="0" + left_pad="25" max_chars="128" name="voice_output_device" top_delta="-4" @@ -99,7 +77,7 @@ follows="left|top" height="16" layout="topleft" - left_delta="-300" + left="18" name="My volume label" top_pad="14" width="200"> 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 5ff02de6f6..d0b4cfdb5b 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -153,9 +153,7 @@ left="8" name="object_horizontal" top_pad="4" - width="278" - font="DejaVu" - font.size="LSmall" /> + width="278" /> <text type="string" length="1" @@ -806,11 +804,12 @@ height="19" initial_value="0" label="Horizontal scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="TexScaleU" top_pad="5" width="265" @@ -821,11 +820,12 @@ height="19" initial_value="0" label="Vertical scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="TexScaleV" width="265" font="DejaVu" @@ -866,11 +866,12 @@ height="19" initial_value="0" label="Horizontal offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="TexOffsetU" width="265" font="DejaVu" @@ -880,11 +881,12 @@ height="19" initial_value="0" label="Vertical offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="TexOffsetV" width="265" font="DejaVu" @@ -894,11 +896,12 @@ height="19" initial_value="0" label="Horizontal scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="bumpyScaleU" top_delta="-115" width="265" @@ -909,11 +912,12 @@ height="19" initial_value="0" label="Vertical scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="bumpyScaleV" width="265" font="DejaVu" @@ -940,11 +944,12 @@ height="19" initial_value="0" label="Horizontal offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="bumpyOffsetU" width="265" font="DejaVu" @@ -954,11 +959,12 @@ height="19" initial_value="0" label="Vertical offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="bumpyOffsetV" width="265" font="DejaVu" @@ -968,11 +974,12 @@ height="19" initial_value="0" label="Horizontal scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="shinyScaleU" top_delta="-115" width="265" @@ -983,11 +990,12 @@ height="19" initial_value="0" label="Vertical scale" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="shinyScaleV" width="265" font="DejaVu" @@ -1014,11 +1022,12 @@ height="19" initial_value="0" label="Horizontal offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="shinyOffsetU" width="265" font="DejaVu" @@ -1028,11 +1037,12 @@ height="19" initial_value="0" label="Vertical offset" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-1" max_val="1" + decimal_digits="5" name="shinyOffsetV" width="265" font="DejaVu" @@ -1081,11 +1091,12 @@ height="19" initial_value="1" label="Scale u" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="gltfTextureScaleU" top_delta="34" width="265" @@ -1096,11 +1107,12 @@ height="19" initial_value="1" label="Scale v" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-10000" max_val="10000" + decimal_digits="5" name="gltfTextureScaleV" width="265" font="DejaVu" @@ -1139,11 +1151,12 @@ height="19" initial_value="0" label="Offset u" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-999" max_val="999" + decimal_digits="5" name="gltfTextureOffsetU" width="265" font="DejaVu" @@ -1153,11 +1166,12 @@ height="19" initial_value="0" label="Offset v" - label_width="205" + label_width="195" layout="topleft" left="10" min_val="-999" max_val="999" + decimal_digits="5" name="gltfTextureOffsetV" width="265" font="DejaVu" 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 40a88d4121..5f97f27db6 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -212,7 +212,7 @@ TestString PleaseIgnore Description: </text> <text_editor - prevalidator="ascii_printable_no_pipe" + prevalidator="ascii_with_newline_no_pipe" commit_on_focus_lost="true" border_style="line" border_thickness="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 8568874089..e1644da338 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -207,6 +207,8 @@ If you feel this is an error, please contact support@secondlife.com</string> <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string> <string name="SavingSettings">Saving your settings...</string> <string name="LoggingOut">Logging out...</string> + <string name="CompressingInventoryCache">Compressing inventory cache...</string> + <string name="ShutdownCleanup">Releasing resources...</string> <string name="ShuttingDown">Shutting down...</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> @@ -226,6 +228,7 @@ If you feel this is an error, please contact support@secondlife.com</string> <string name="Toycamera">Toy Camera</string> <!-- Tooltip --> + <string name="ReorderClothingTooltip">Drag to reorder layers, or use the arrows</string> <!-- Hint shown on clothing rows that can be dragged to reorder --> <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> <string name="TooltipNoName">(no name)</string> <!-- No name on an object --> <string name="TooltipOwner">Owner:</string> <!-- Owner name follows --> @@ -599,7 +602,7 @@ http://secondlife.com/support for help fixing this problem. <string name="Validator_ShouldBeDigitOrAlphaOrPunctNotSpace">Invalid character [NR]: '[CH]' (should only be a digit or an alpha-numeric ASCII character or a punctuation with no space)</string> <string name="Validator_ShouldBeDigitNotSpace">Invalid character [NR]: '[CH]' (should only be a digit with no space)</string> <string name="Validator_ShouldBeASCII">Invalid character [NR]: '[CH]' (should only be an ASCII character)</string> - <string name="Validator_ShouldBeNewLineOrASCII">Invalid character [NR]: '[CH]' (should only be an ASCII character or a new line)</string> + <string name="Validator_ShouldBeNewLineOrASCIINoPipe">Character [CH] at position [NR] should be printable ASCII (excluding pipe) or newline</string> <!-- LSL Usage Hover Tips --> <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window). @@ -2326,7 +2329,7 @@ For AI Character: Get the closest navigable point to the point provided. <string name="LeaveMouselook">Press ESC to return to World View</string> <!-- inventory --> - <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> + <string name="InventoryNoMatchingItems">No matching items.</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> @@ -4053,6 +4056,8 @@ Try enclosing path to the editor with double quotes. (e.g. "/path to my/editor" "%s")</string> <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string> <string name="ExternalEditorFailedToRun">External editor failed to run.</string> + <string name="ExternalEditorFailedToStart">Failed to start the WebSocket server. Ensure the ExternalWebsocketSyncEnable setting is on.</string> + <string name="VSCodeLaunchFailed">Failed to launch VS Code. Ensure the 'code' command is available on your PATH.</string> <!-- Machine translation of chat messahes --> <string name="TranslationFailed">Translation failed: [REASON]</string> @@ -4208,7 +4213,6 @@ name="Command_360_Capture_Label">360 snapshot</string> <string name="Command_Environments_Label">My Environments</string> <string name="Command_Gestures_Label">Gestures</string> <string name="Command_Grid_Status_Label">Grid status</string> - <string name="Command_HowTo_Label">Guidebook</string> <string name="Command_Inventory_Label">Inventory</string> <string name="Command_Map_Label">Map</string> <string name="Command_Marketplace_Label">Marketplace</string> @@ -4245,7 +4249,6 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string> <string name="Command_Environments_Tooltip">My Environments</string> <string name="Command_Gestures_Tooltip">Gestures for your avatar</string> <string name="Command_Grid_Status_Tooltip">Show current Grid status</string> - <string name="Command_HowTo_Tooltip">How to do common tasks</string> <string name="Command_Inventory_Tooltip">View and use your belongings</string> <string name="Command_Map_Tooltip">Map of the world</string> <string name="Command_Marketplace_Tooltip">Go shopping</string> diff --git a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml index e42bef4a45..c26c698fb2 100644 --- a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml @@ -4,9 +4,11 @@ image_selected="SegmentedBtn_Left_Selected" image_unselected="SegmentedBtn_Left_Off" image_disabled="SegmentedBtn_Left_Disabled"/> - <combo_button image_selected="ComboButton_Selected" - image_unselected="ComboButton_Off" - image_disabled="ComboButton_Disabled" - pad_right="6" - tab_stop="false"/> + <drop_down_button image_selected="ComboButton_Selected" + image_unselected="ComboButton_Off" + image_disabled="ComboButton_Disabled" + image_pressed="ComboButton_Selected" + image_pressed_selected="ComboButton_Selected" + pad_right="6" + tab_stop="false"/> </flyout_button> diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index 8103a95376..08e0ed4557 100644 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -23,6 +23,8 @@ con contribuciones de código abierto de:</text> Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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 diff --git a/indra/newview/skins/default/xui/es/floater_how_to.xml b/indra/newview/skins/default/xui/es/floater_how_to.xml deleted file mode 100644 index 4a57dc3643..0000000000 --- a/indra/newview/skins/default/xui/es/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="CÓMO"/> diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml index 9672f910ea..9686dc8c2b 100644 --- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: SCRIPT NUEVO"> <floater.string name="not_allowed"> - No puedes ver ni editar este script. Ha sido configurado como "no copiable". Necesitas todos los permisos para ver o editar un script que está dentro de un objeto. + No puedes ver ni editar este script. Ha sido configurado como "no copiable" o "no modificable". Necesitas estos permisos para ver o editar un script. </floater.string> <floater.string name="script_running"> Ejecutándose diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 739391b965..5dee9eb3a8 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -1119,7 +1119,6 @@ Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pu Tu personaje aparecerá en un momento. Para caminar, usa las teclas del cursor. -En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE]. Por favor, elige el avatar masculino o femenino. Puedes cambiar más adelante tu elección. <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index 36888850c4..27b3c407cf 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Configuración de proxy: </text> <button label="Ajustar la configuración de proxy" label_selected="Elegir" name="set_proxy"/> + <text name="os_hibernation_mode"> + Evitar que el sistema entre en hibernación si no está Ausente: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Solo evita que el sistema entre en suspensión si el usuario no está ausente"> + <combo_box.item label="Puede hibernar" name="can_hibernate"/> + <combo_box.item label="No puede hibernar, puede apagar la pantalla" name="cant_hibernate"/> + <combo_box.item label="No puede hibernar, no puede apagar la pantalla" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml index 89e9304693..e19580533b 100644 --- a/indra/newview/skins/default/xui/es/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml @@ -4,7 +4,7 @@ Cargando... </panel.string> <panel.string name="can_not_view"> - No puedes ver ni editar este script. Ha sido configurado como "no copiable". Necesitas todos los permisos para ver o editar un script que está dentro de un objeto. + No puedes ver ni editar este script. Ha sido configurado como "no copiable" o "no modificable". Necesitas estos permisos para ver o editar un script. </panel.string> <panel.string name="public_objects_can_not_run"> Los objetos públicos no pueden ejecutar scripts diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml index 0734e9c417..c3f0a2995e 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Descripción: </text> - <line_editor name="LabelItemDesc" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/> + <text_editor name="LabelItemDesc" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/> <text name="LabelCreatorTitle"> Creador: </text> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index c9bb93b315..640b4f107a 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -5439,9 +5439,6 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <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> @@ -5538,9 +5535,6 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <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> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index b6ea621177..7c6ae22fdf 100644 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -23,6 +23,8 @@ avec les contributions Open Source de :</text> Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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 diff --git a/indra/newview/skins/default/xui/fr/floater_how_to.xml b/indra/newview/skins/default/xui/fr/floater_how_to.xml deleted file mode 100644 index a414212ba0..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="AIDE RAPIDE"/> diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml index a0d1197ea7..97644a5113 100644 --- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> <floater.string name="not_allowed"> - Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les droits requis. + Ce script ne peut pas être visualisé ou modifié, car il est défini comme « non copiable » ou « non modifiable ». Pour visualiser ou modifier un script, vous devez avoir ces permissions. </floater.string> <floater.string name="script_running"> Exécution en cours diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 587c88faad..9c79f288c1 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -1109,7 +1109,6 @@ Vérifiez votre connexion Internet et réessayez dans quelques minutes, cliquez Votre personnage va apparaître dans un moment. Pour marcher, utilisez les flèches de direction. -Appuyez sur F1 pour obtenir de l'aide ou en savoir plus sur [SECOND_LIFE]. Choisissez un avatar homme ou femme. Vous pourrez revenir sur votre décision plus tard. <usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml index c010fa9e90..60cbe93e6e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Paramètres de proxy : </text> <button label="Définir" label_selected="Parcourir" name="set_proxy"/> + <text name="os_hibernation_mode"> + Empêcher l’OS d’hiberner si vous n’êtes pas absent : + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Empêche seulement la mise en veille de l’OS si l’utilisateur n’est pas absent"> + <combo_box.item label="Peut hiberner" name="can_hibernate"/> + <combo_box.item label="Ne peut pas hiberner, peut éteindre l’écran" name="cant_hibernate"/> + <combo_box.item label="Ne peut pas hiberner, ne peut pas éteindre l’écran" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml index 0a33463cbb..f6bc55c189 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml @@ -4,7 +4,7 @@ Chargement... </panel.string> <panel.string name="can_not_view"> - Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les permissions requises. + Ce script ne peut pas être visualisé ou modifié, car il est défini comme « non copiable » ou « non modifiable ». Pour visualiser ou modifier un script, vous devez avoir ces permissions. </panel.string> <panel.string name="public_objects_can_not_run"> Les objets publics ne peuvent pas exécuter de scripts diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml index caeb1f8589..47bd7d5949 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Description : </text> - <line_editor name="LabelItemDesc" tool_tip="Lorsque les utilisateurs sélectionnent 'Conseils de survol sur tous les objets' dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/> + <text_editor name="LabelItemDesc" tool_tip="Lorsque les utilisateurs sélectionnent 'Conseils de survol sur tous les objets' dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/> <text name="LabelCreatorTitle"> Créateur : </text> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 770b52242a..c7d8652584 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -5538,9 +5538,6 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <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> @@ -5637,9 +5634,6 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <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> diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index 77be47d749..2bba6a4fad 100644 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -23,6 +23,8 @@ con contributi open source da:</text> Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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 diff --git a/indra/newview/skins/default/xui/it/floater_how_to.xml b/indra/newview/skins/default/xui/it/floater_how_to.xml deleted file mode 100644 index 8f0e210571..0000000000 --- a/indra/newview/skins/default/xui/it/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="ISTRUZIONI"/> diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml index c28df6c12e..84f668332e 100644 --- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: NUOVO SCRIPT"> <floater.string name="not_allowed"> - Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all'interno di un oggetto, devi avere i necessari diritti di modifica. + Questo script non può essere visualizzato né modificato, perché è impostato come "non copiabile" o "non modificabile". Per visualizzare o modificare uno script, devi avere questi permessi. </floater.string> <floater.string name="script_running"> In esecuzione diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index f79cc1515b..284f947b18 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -1115,7 +1115,6 @@ Controlla la tua connessione Internet e riprova fra qualche minuto, oppure clicc Il tuo avatar apparirà fra un attimo. Usa le frecce per muoverti. -Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECOND_LIFE]. Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi. <usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/> </notification> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml index c9d90539e1..95ecf05617 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Impostazioni proxy: </text> <button label="Regola impostazioni proxy" label_selected="Sfoglia" name="set_proxy" width="160"/> + <text name="os_hibernation_mode"> + Impedisci al sistema operativo di ibernarsi se non sei Assente: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Impedisce al sistema operativo di andare in sospensione solo se l'utente non è assente"> + <combo_box.item label="Può ibernarsi" name="can_hibernate"/> + <combo_box.item label="Non può ibernarsi, può spegnere lo schermo" name="cant_hibernate"/> + <combo_box.item label="Non può ibernarsi, non può spegnere lo schermo" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml index 3cbdadbac8..72e9b45321 100644 --- a/indra/newview/skins/default/xui/it/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml @@ -4,7 +4,7 @@ Caricamento in corso... </panel.string> <panel.string name="can_not_view"> - Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all'interno di un oggetto, devi avere i necessari diritti di modifica. + Questo script non può essere visualizzato né modificato, perché è impostato come "non copiabile" o "non modificabile". Per visualizzare o modificare uno script, devi avere questi permessi. </panel.string> <panel.string name="public_objects_can_not_run"> Gli oggetti pubblici non possono eseguire gli script diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index 9d659bb50d..2941b1ba04 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Descrizione: </text> - <line_editor name="LabelItemDesc" tool_tip="Quando la dicitura "Vedi suggerimenti su tutti gli oggetti" è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/> + <text_editor name="LabelItemDesc" tool_tip="Quando la dicitura "Vedi suggerimenti su tutti gli oggetti" è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/> <text name="LabelCreatorTitle"> Ideatore: </text> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index d80da3c0c8..75802b7786 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -5453,9 +5453,6 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Command_Grid_Status_Label"> Stato della griglia </string> - <string name="Command_HowTo_Label"> - Istruzioni - </string> <string name="Command_Inventory_Label"> Inventario </string> @@ -5552,9 +5549,6 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <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> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 6cd22f6a31..dd24a04aed 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -27,6 +27,7 @@ google-perftools Copyright (c) 2005, Google Inc. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. +luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine ogg/vorbis Copyright (C) 2002, Xiphophorus OpenSSL Copyright (C) 1998-2008 The OpenSSL Project. diff --git a/indra/newview/skins/default/xui/ja/floater_how_to.xml b/indra/newview/skins/default/xui/ja/floater_how_to.xml deleted file mode 100644 index 480fb4649c..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="ウェルカムアイランドガイドブック" filename="floater_web_content.xml"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml index 770d7b4a13..0813922635 100644 --- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="スクリプト:新しいスクリプト"> <floater.string name="not_allowed"> - このスクリプトは「複製不可」のため、表示・編集することができません。オブジェクト内のスクリプトの表示・編集には、全権限が必要です。 + このスクリプトは「コピー不可」または「修正不可」のため、表示・編集することができません。スクリプトを表示・編集するには、これらの権限が必要です。 </floater.string> <floater.string name="script_running"> 実行中 diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 9ec7a0de98..07d6c41213 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2162,7 +2162,6 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries </form> </notification> <notification name="WelcomeChooseSex">まもなく、あなたのアバターが表示されます。矢印キーを使用して歩きます。 -ヘルプが必要なときや、[SECOND_LIFE]について知りたいときは、F1キーを押してください。 男性あるいは女性のアバターを選択してください。この設定は後で変更できます。 <tag> confirm diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml index 959f827a61..8940ca5bc9 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml @@ -36,4 +36,12 @@ プロキシ設定: </text> <button label="プロキシ設定を調整" label_selected="参照" name="set_proxy"/> + <text name="os_hibernation_mode"> + 離席中でない場合、OS の休止状態を防止: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="ユーザーが離席中でない場合にのみ、OS のスリープを防止します"> + <combo_box.item label="休止状態を許可" name="can_hibernate"/> + <combo_box.item label="休止状態を禁止(画面オフは可)" name="cant_hibernate"/> + <combo_box.item label="休止状態を禁止(画面オフも不可)" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml index 0861b5caf1..5cf04c7537 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml @@ -4,7 +4,7 @@ 読み込んでいます… </panel.string> <panel.string name="can_not_view"> - このスクリプトは「コピー不可」のため、表示・編集することができません。オブジェクト内のスクリプトの表示・編集には、全権限が必要です。 + このスクリプトは「コピー不可」または「修正不可」のため、表示・編集することができません。スクリプトを表示・編集するには、これらの権限が必要です。 </panel.string> <panel.string name="public_objects_can_not_run"> 公共オブジェクトで、スクリプトを実行することはできません。 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 520ef848a0..b1ac5fd460 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> 説明: </text> - <line_editor name="LabelItemDesc" tool_tip="ビューアの設定で[すべてのオブジェクト上でヒントを表示]が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大127バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/> + <text_editor name="LabelItemDesc" tool_tip="ビューアの設定で[すべてのオブジェクト上でヒントを表示]が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大127バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/> <text name="LabelCreatorTitle"> 制作者: </text> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 99909d80d1..d6f259faf3 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -7143,9 +7143,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだã <string name="Command_Grid_Status_Label"> グリッド状況 </string> - <string name="Command_HowTo_Label"> - ハウツー - </string> <string name="Command_Inventory_Label"> インベントリ </string> @@ -7233,9 +7230,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだã <string name="Command_Grid_Status_Tooltip"> 現在のグリッドステータスを表示します。 </string> - <string name="Command_HowTo_Tooltip"> - 一般的タスクの実行方法を表示します。 - </string> <string name="Command_Inventory_Tooltip"> インベントリの内容を表示したり使用したりします。 </string> diff --git a/indra/newview/skins/default/xui/pl/floater_how_to.xml b/indra/newview/skins/default/xui/pl/floater_how_to.xml deleted file mode 100644 index 2c412de30a..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_how_to" title="SAMOUCZEK" /> diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml index 1b3e0d0e74..0c59d90468 100644 --- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater name="script ed float" title="SKRYPT: NOWY SKRYPT"> <floater.string name="not_allowed"> - Nie posiadasz praw do podejrzenia lub edycji kodu tego skryptu, ponieważ ma on ustawione ograniczone zezwolenia. Musisz posiadać pełne prawa by móc zobaczyć lub edytować kod skryptu wewnątrz obiektu. + Nie możesz zobaczyć ani edytować tego skryptu, ponieważ ustawiono dla niego "brak kopiowania" lub "brak modyfikacji". Aby zobaczyć lub edytować skrypt, potrzebujesz tych uprawnień. </floater.string> <floater.string name="script_running"> Włączony diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index ad9d2ecf1d..a8ea3c7c1a 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -1397,7 +1397,6 @@ Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kil Twoja postać pojawi się za moment. Używaj strzałek żeby się poruszać. -Naciśnij F1 w dowolnej chwili po pomoc albo żeby dowiedzieć się więcej o [SECOND_LIFE]. Wybierz awatara właściwej płci. Ten wybór będzie można później zmienić. <usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna" /> </notification> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml index bd36f10509..7147f024cb 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml @@ -33,4 +33,12 @@ Ustawienia proxy: </text> <button label="Dostosuj ustawienia" label_selected="Przeglądaj" name="set_proxy" /> + <text name="os_hibernation_mode"> + Zapobiegaj hibernacji systemu, gdy użytkownik nie jest AFK: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Zapobiega usypianiu systemu tylko wtedy, gdy użytkownik nie jest AFK"> + <combo_box.item label="Może hibernować" name="can_hibernate"/> + <combo_box.item label="Nie może hibernować, może wyłączyć ekran" name="cant_hibernate"/> + <combo_box.item label="Nie może hibernować, nie może wyłączyć ekranu" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml index 828f1c571f..01b88613a0 100644 --- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml @@ -4,7 +4,7 @@ Ładowanie... </panel.string> <panel.string name="can_not_view"> - Nie posiadasz praw do zobaczenia lub edycji kodu tego skryptu, ponieważ ustawione zostały na niego ograniczenia. Musisz posiadać pełne prawa by móc zobaczyć lub edytować kod skryptu w zawartości obiektu. + Nie możesz zobaczyć ani edytować tego skryptu, ponieważ ustawiono dla niego "brak kopiowania" lub "brak modyfikacji". Aby zobaczyć lub edytować skrypt, potrzebujesz tych uprawnień. </panel.string> <panel.string name="public_objects_can_not_run"> Publiczne obiekty nie mogą uruchamiać skryptów diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 7a61878618..dc7ca53aaa 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -4992,9 +4992,6 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu. <string name="Command_Grid_Status_Label"> Status świata </string> - <string name="Command_HowTo_Label"> - Samouczek - </string> <string name="Command_Inventory_Label"> Szafa </string> @@ -5076,9 +5073,6 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu. <string name="Command_Grid_Status_Tooltip"> Pokaż obecny status świata </string> - <string name="Command_HowTo_Tooltip"> - Jak wykonywać zwyczajne rzeczy - </string> <string name="Command_Inventory_Tooltip"> Przeglądaj i używaj rzeczy, jakie należą do Ciebie </string> diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml index 0e95c53109..f7dff635a7 100644 --- a/indra/newview/skins/default/xui/pt/floater_about.xml +++ b/indra/newview/skins/default/xui/pt/floater_about.xml @@ -23,6 +23,8 @@ com contribuições de código aberto de:</text> Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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 diff --git a/indra/newview/skins/default/xui/pt/floater_how_to.xml b/indra/newview/skins/default/xui/pt/floater_how_to.xml deleted file mode 100644 index 15c4946cb0..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="COMO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml index 635bc2d34b..a55dd1b406 100644 --- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: NOVO SCRIPT"> <floater.string name="not_allowed"> - Você não pode ver ou editar o script, uma vez que está definido como "não" copiar. Você precisa de permissões para ver ou editar um script dentro de um objeto. + Você não pode ver ou editar este script, pois ele está definido como "não copiável" ou "não modificável". Você precisa dessas permissões para ver ou editar um script. </floater.string> <floater.string name="script_running"> Executando diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml index 83f7b24572..eefd407a3c 100644 --- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml @@ -1,8 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="DEBUG SETTINGS"> +<floater name="settings_debug" title="CONFIGURAÇÕES DE DEPURAÇÃO"> + <filter_editor label="Digite o texto de busca" name="filter_input"/> + <scroll_list name="setting_list"> + <scroll_list.columns label="Configuração" name="setting"/> + </scroll_list> + <text name="setting_name_txt">Nome da configuração de depuração</text> <radio_group name="boolean_combo"> - <radio_item label="TRUE" name="TRUE" /> - <radio_item label="FALSE" name="FALSE" /> + <radio_item label="VERDADEIRO" name="TRUE"/> + <radio_item label="FALSO" name="FALSE"/> </radio_group> <color_swatch label="Cor" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> @@ -10,4 +15,5 @@ <spinner label="x" name="val_spinner_3"/> <spinner label="x" name="val_spinner_4"/> <button label="Restaurar padrão" name="default_btn"/> + <check_box label="Mostrar apenas configurações alteradas" name="hide_default"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index a3220bca54..153109fc1b 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -1108,7 +1108,6 @@ Cheque sua conexão e tente em alguns minutos, clique na Ajuda para acessar o [S Seu personagem irá aparecer num momento. Use as teclas de seta para andar. -Pressione a tecla F1 para ajuda ou aprender mais sobre [SECOND_LIFE]. Por favor, escolha se o seu avatar é feminino ou masculino. Você pode mudar de idéia depois. <usetemplate name="okcancelbuttons" notext="Feminino" yestext="Masculino"/> </notification> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml index 56fc225bc0..101f58488d 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Configurações de proxy: </text> <button label="Ajustar configurações de proxy" label_selected="Procurar" name="set_proxy" width="180"/> + <text name="os_hibernation_mode"> + Impedir que o sistema entre em hibernação se não estiver Ausente: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Só impede que o sistema entre em suspensão se o utilizador não estiver ausente"> + <combo_box.item label="Pode hibernar" name="can_hibernate"/> + <combo_box.item label="Não pode hibernar, pode desligar o ecrã" name="cant_hibernate"/> + <combo_box.item label="Não pode hibernar, não pode desligar o ecrã" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml index c546adcf8b..8d33035d02 100644 --- a/indra/newview/skins/default/xui/pt/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml @@ -4,7 +4,7 @@ Carregando... </panel.string> <panel.string name="can_not_view"> - Você não pode ver ou editar o script, uma vez que está definido como "não" copiar ". Você precisa de permissões para ver ou editar um script dentro de um objeto. + Você não pode ver ou editar este script, pois ele está definido como "não copiável" ou "não modificável". Você precisa dessas permissões para ver ou editar um script. </panel.string> <panel.string name="public_objects_can_not_run"> Objetos públicos não podem executar scripts diff --git a/indra/newview/skins/default/xui/pt/settings_comments.xml b/indra/newview/skins/default/xui/pt/settings_comments.xml new file mode 100644 index 0000000000..22f6487847 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/settings_comments.xml @@ -0,0 +1,3019 @@ +<?xml version="1.0" encoding="utf-8"?> +<llsd> +<map> + <key>360CaptureCameraFOV</key> + <string>Campo de visão da câmera WebGL que converte o cubemap em uma imagem equirretangular.</string> + <key>360CaptureDebugSaveImage</key> + <string>Se ativado, salva cada cube map como imagem, bem como a URL de dados JavaScript, para fins de depuração.</string> + <key>360CaptureHideAvatars</key> + <string>Se ativado, remove todos os avatares da captura 360.</string> + <key>360CaptureJPEGEncodeQuality</key> + <string>Valor de qualidade usado no codificador JPEG (0..100).</string> + <key>360CaptureNumRenderPasses</key> + <string>Número de vezes que a cena é renderizada ao tirar uma captura.</string> + <key>360CaptureOutputImageWidth</key> + <string>Largura da imagem 360 equirretangular de saída.</string> + <key>AFKTimeout</key> + <string>Tempo antes de definir automaticamente o modo AFK (ausente do teclado) em segundos (0=nunca). Valores válidos: 0, 120, 300, 600, 1800.</string> + <key>AbuseReportScreenshotDelay</key> + <string>Atraso antes de tirar a captura de tela para evitar artefatos de interface.</string> + <key>AckCollectTime</key> + <string>Tempo de coleta e agrupamento de mensagens de confirmação (ack).</string> + <key>ActiveFloaterTransparency</key> + <string>Transparência de floaters ativos (floaters com foco).</string> + <key>AdminMenu</key> + <string>Ativa o menu de administrador de depuração no menu principal. Nota: apenas permite exibir o menu; não concede privilégios de administrador.</string> + <key>AdvanceSnapshot</key> + <string>Exibir configurações de parâmetros avançados na interface de captura.</string> + <key>AgentPause</key> + <string>Solicitar ao simulador que pare de atualizar o agente enquanto ativado.</string> + <key>AlertedUnsupportedHardware</key> + <string>Define se há hardware não suportado e já foi exibida uma notificação.</string> + <key>AllowMultipleViewers</key> + <string>Permitir múltiplos viewers.</string> + <key>AllowSelectAvatar</key> + <string>Permite ao usuário selecionar e mover avatares; o movimento é local ao viewer, não se propaga ao servidor e também suprime atualizações de posição do avatar enquanto avatares estão selecionados.</string> + <key>AllowSelfImpostor</key> + <string>Permite que seu próprio tempo de renderização transforme seu avatar em impostor.</string> + <key>AllowTapTapHoldRun</key> + <string>Tocar duas vezes em uma tecla de direção e mantê-la pressionada faz o avatar correr.</string> + <key>AnalyzePerformance</key> + <string>Solicitar análise de desempenho para uma execução específica do viewer.</string> + <key>AnimateTextures</key> + <string>Ativar animação de texturas (depuração).</string> + <key>AnimatedObjectsAllowLeftClick</key> + <string>Permite interação com clique esquerdo em objetos animados. Impacto de desempenho incerto.</string> + <key>AnimatedObjectsMaxLegalOffset</key> + <string>Deslocamento visual máximo entre a posição do objeto e a posição renderizada.</string> + <key>AnimatedObjectsMaxLegalSize</key> + <string>Tamanho máximo da caixa delimitadora para a posição renderizada de objetos animados.</string> + <key>AnimationUploadFolder</key> + <string>Todos os uploads de animações serão armazenados neste diretório (UUID).</string> + <key>AppearanceCameraMovement</key> + <string>Ao entrar no modo de edição de aparência, a câmera aproxima a parte do avatar selecionada no momento.</string> + <key>ApplyColorImmediately</key> + <string>Pré-visualizar seleções no seletor de cores imediatamente.</string> + <key>ArrowKeysAlwaysMove</key> + <string>Enquanto o cursor está na caixa de entrada de chat, as setas continuam controlando seu avatar.</string> + <key>AuctionShowFence</key> + <string>Ao leiloar terreno, incluir o marcador de limite da parcela na captura.</string> + <key>AudioLevelAmbient</key> + <string>Nível de áudio dos sons do ambiente.</string> + <key>AudioLevelMaster</key> + <string>Nível de áudio mestre, ou volume geral.</string> + <key>AudioLevelMedia</key> + <string>Nível de áudio de filmes Quicktime.</string> + <key>AudioLevelMic</key> + <string>Nível de áudio da entrada de microfone.</string> + <key>AudioLevelMusic</key> + <string>Nível de áudio de música em streaming.</string> + <key>AudioLevelSFX</key> + <string>Nível de áudio dos efeitos sonoros no mundo.</string> + <key>AudioLevelUI</key> + <string>Nível de áudio dos efeitos sonoros da interface.</string> + <key>AudioLevelVoice</key> + <string>Nível de áudio do chat de voz.</string> + <key>AudioLevelWind</key> + <string>Nível de áudio do ruído do vento ao ficar parado.</string> + <key>AudioStreamingMedia</key> + <string>Ativar streaming.</string> + <key>AudioStreamingMusic</key> + <string>Ativar áudio em streaming.</string> + <key>AutoAcceptNewInventory</key> + <string>Aceitar automaticamente novos notecards/texturas/landmarks.</string> + <key>AutoDisengageMic</key> + <string>Desligar o microfone automaticamente ao encerrar chamadas de IM.</string> + <key>AutoLeveling</key> + <string>Manter a Flycam nivelada.</string> + <key>AutoLogin</key> + <string>Fazer login automaticamente usando a última combinação de usuário/senha.</string> + <key>AutoMimeDiscovery</key> + <string>Ativar a descoberta de tipo MIME de URLs de mídia pelo viewer.</string> + <key>AutoPilotLocksCamera</key> + <string>Manter a posição da câmera travada enquanto o avatar caminha até a posição selecionada.</string> + <key>AutoReplace</key> + <string>Substitui palavras-chave por uma palavra ou frase configurada.</string> + <key>AutoSnapshot</key> + <string>Atualizar a captura quando a câmera para de se mover, ou quando qualquer parâmetro muda.</string> + <key>AutoTuneFPS</key> + <string>Permitir que o viewer ajuste suas configurações para alcançar o FPS desejado.</string> + <key>AutoTuneImpostorByDistEnabled</key> + <string>Ativar/desativar o uso de MaxNonImpostor para limitar a renderização de avatares por distância.</string> + <key>AutoTuneImpostorFarAwayDistance</key> + <string>Avatares além deste alcance serão otimizados automaticamente.</string> + <key>AutoTuneLock</key> + <string>Quando ativado, o viewer mudará dinamicamente as configurações até que o ajuste automático seja explicitamente desativado.</string> + <key>AutoTuneRenderFarClipMin</key> + <string>A menor distância de desenho que o ajuste automático pode usar.</string> + <key>AutoTuneRenderFarClipTarget</key> + <string>A distância de desenho que o ajuste automático tentará alcançar.</string> + <key>AutomaticFly</key> + <string>Voar segurando a tecla de pulo ou usando o comando "Voar" (FALSE = voar apenas pelo comando "Voar").</string> + <key>AvatarAxisDeadZone0</key> + <string>Zona morta do eixo Z (movimento vertical) do avatar.</string> + <key>AvatarAxisDeadZone1</key> + <string>Zona morta do eixo X (movimento lateral) do avatar.</string> + <key>AvatarAxisDeadZone2</key> + <string>Zona morta do eixo Y (movimento para frente/trás) do avatar.</string> + <key>AvatarAxisDeadZone3</key> + <string>Zona morta da rolagem (roll) do avatar.</string> + <key>AvatarAxisDeadZone4</key> + <string>Zona morta da elevação (pitch) do avatar.</string> + <key>AvatarAxisDeadZone5</key> + <string>Zona morta da guinada (yaw) do avatar.</string> + <key>AvatarAxisScale0</key> + <string>Fator de escala do eixo Z (movimento vertical) do avatar.</string> + <key>AvatarAxisScale1</key> + <string>Fator de escala do eixo X (movimento lateral) do avatar.</string> + <key>AvatarAxisScale2</key> + <string>Fator de escala do eixo Y (movimento para frente/trás) do avatar.</string> + <key>AvatarAxisScale3</key> + <string>Fator de escala da rolagem (roll) do avatar.</string> + <key>AvatarAxisScale4</key> + <string>Fator de escala da elevação (pitch) do avatar.</string> + <key>AvatarAxisScale5</key> + <string>Fator de escala da guinada (yaw) do avatar.</string> + <key>AvatarBakedTextureUploadTimeout</key> + <string>Especifica o tempo máximo em segundos a aguardar antes de enviar suas texturas assadas para a aparência do avatar. Defina 0 para desativar e aguardar até que todas as texturas assadas estejam na resolução máxima.</string> + <key>AvatarExtentRefreshMaxPerBatch</key> + <string>Quantos avatares queremos tratar no total por lote (padrão é 5).</string> + <key>AvatarExtentRefreshPeriodBatch</key> + <string>Em quantos quadros distribuímos por padrão ao atualizar extensões (padrão é 4).</string> + <key>AvatarFeathering</key> + <string>Suavização do avatar (menos é mais suave).</string> + <key>AvatarHoverOffsetZ</key> + <string>Ajuste final da posição Z do avatar após todas as outras correções.</string> + <key>AvatarNameTagMode</key> + <string>Selecionar o modo da etiqueta de nome do avatar.</string> + <key>AvatarPhysics</key> + <string>Ativar física do avatar.</string> + <key>AvatarRotateThresholdFast</key> + <string>Ângulo entre a direção do avatar e a da câmera no qual o avatar gira para a mesma direção da câmera, ao se mover rápido (graus).</string> + <key>AvatarRotateThresholdSlow</key> + <string>Ângulo entre a direção do avatar e a da câmera no qual o avatar gira para a mesma direção da câmera, ao se mover devagar (graus).</string> + <key>AvatarSex</key> + <string>Sexo do avatar usado na interface de edição de aparência (0 = feminino, 1 = masculino).</string> + <key>AvatarSitRotation</key> + <string>Rotação real do avatar sentado usada na predefinição.</string> + <key>AvatarWelcomePack</key> + <string>Conteúdo do pacote de boas-vindas do avatar.</string> + <key>AzureTranslateAPIKey</key> + <string>Dados do serviço de tradução Azure para uso com a API do MS Azure Translator.</string> + <key>BackgroundYieldTime</key> + <string>Tempo a ceder a cada quadro para outros aplicativos quando o SL não é a janela em primeiro plano (milissegundos).</string> + <key>BasicUITooltips</key> + <string>Mostrar dicas para vários elementos de interface 2D como botões ou caixas de seleção; não suprime dicas de arrastar e soltar, no mundo, links ou mídia.</string> + <key>BatchSizeAIS3</key> + <string>Quantidade de pastas que o AIS empacota por requisição de subconjunto de categoria.</string> + <key>BlockAvatarAppearanceMessages</key> + <string>Ignora mensagens de aparência (para simular a Ruth).</string> + <key>BlockPeopleSortOrder</key> + <string>Especifica a ordem de classificação para pessoas recentes (0 = por nome, 1 = por tipo).</string> + <key>BrowserEnableJSObject</key> + <string>(AVISO: recurso avançado. Use se estiver ciente das implicações). Ativar ou desativar o objeto de ponte entre o viewer e o Javascript.</string> + <key>BrowserFileAccessFromFileUrls</key> + <string>Permitir acesso a arquivos locais via URLs de arquivo no navegador embutido.</string> + <key>BrowserIgnoreSSLCertErrors</key> + <string>APENAS PARA TESTES: dizer ao navegador web embutido para ignorar erros de certificado SSL.</string> + <key>BrowserJavascriptEnabled</key> + <string>Ativar Javascript no navegador web embutido?</string> + <key>BrowserPluginsEnabled</key> + <string>Ativar plugins web no navegador web embutido?</string> + <key>BrowserProxyAddress</key> + <string>Endereço para o Proxy Web.</string> + <key>BrowserProxyEnabled</key> + <string>Usar Proxy Web.</string> + <key>BrowserProxyPort</key> + <string>Porta para o Proxy Web.</string> + <key>BuildAxisDeadZone0</key> + <string>Zona morta do eixo Z (movimento vertical) de construção.</string> + <key>BuildAxisDeadZone1</key> + <string>Zona morta do eixo X (movimento lateral) de construção.</string> + <key>BuildAxisDeadZone2</key> + <string>Zona morta do eixo Y (movimento para frente/trás) de construção.</string> + <key>BuildAxisDeadZone3</key> + <string>Zona morta da rolagem (roll) de construção.</string> + <key>BuildAxisDeadZone4</key> + <string>Zona morta da elevação (pitch) de construção.</string> + <key>BuildAxisDeadZone5</key> + <string>Zona morta da guinada (yaw) de construção.</string> + <key>BuildAxisScale0</key> + <string>Fator de escala do eixo Z (movimento vertical) de construção.</string> + <key>BuildAxisScale1</key> + <string>Fator de escala do eixo X (movimento lateral) de construção.</string> + <key>BuildAxisScale2</key> + <string>Fator de escala do eixo Y (movimento para frente/trás) de construção.</string> + <key>BuildAxisScale3</key> + <string>Fator de escala da rolagem (roll) de construção.</string> + <key>BuildAxisScale4</key> + <string>Fator de escala da elevação (pitch) de construção.</string> + <key>BuildAxisScale5</key> + <string>Fator de escala da guinada (yaw) de construção.</string> + <key>BuildFeathering</key> + <string>Suavização de construção (menos é mais suave).</string> + <key>BulkChangeEveryoneCopy</key> + <string>Objetos alterados em massa podem ser copiados por todos.</string> + <key>BulkChangeIncludeAnimations</key> + <string>Alterações de permissão em massa afetam animações.</string> + <key>BulkChangeIncludeBodyParts</key> + <string>Alterações de permissão em massa afetam partes do corpo.</string> + <key>BulkChangeIncludeClothing</key> + <string>Alterações de permissão em massa afetam roupas.</string> + <key>BulkChangeIncludeGestures</key> + <string>Alterações de permissão em massa afetam gestos.</string> + <key>BulkChangeIncludeMaterials</key> + <string>Alterações de permissão em massa afetam materiais.</string> + <key>BulkChangeIncludeNotecards</key> + <string>Alterações de permissão em massa afetam notecards.</string> + <key>BulkChangeIncludeObjects</key> + <string>Alterações de permissão em massa afetam objetos.</string> + <key>BulkChangeIncludeScripts</key> + <string>Alterações de permissão em massa afetam scripts.</string> + <key>BulkChangeIncludeSettings</key> + <string>Alterações de permissão em massa afetam configurações de ambiente.</string> + <key>BulkChangeIncludeSounds</key> + <string>Alterações de permissão em massa afetam sons.</string> + <key>BulkChangeIncludeTextures</key> + <string>Alterações de permissão em massa afetam texturas.</string> + <key>BulkChangeNextOwnerCopy</key> + <string>Objetos alterados em massa podem ser copiados pelo próximo proprietário.</string> + <key>BulkChangeNextOwnerModify</key> + <string>Objetos alterados em massa podem ser modificados pelo próximo proprietário.</string> + <key>BulkChangeNextOwnerTransfer</key> + <string>Objetos alterados em massa podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>BulkChangeShareWithGroup</key> + <string>Objetos alterados em massa são compartilhados com o grupo ativo no momento.</string> + <key>BulkUpload2KTextures</key> + <string>Upload em massa redimensiona texturas para 2K se verdadeiro, ou para 1K se falso.</string> + <key>CacheLocation</key> + <string>Controla a localização do cache em disco local.</string> + <key>CacheLocationTopFolder</key> + <string>Controla a pasta raiz do cache em disco local.</string> + <key>CacheSize</key> + <string>Controla a quantidade de espaço em disco reservada para cache local de arquivos, em MB.</string> + <key>CacheValidateCounter</key> + <string>Usado para distribuir a validação do cache.</string> + <key>CallLogSortOrder</key> + <string>Especifica a ordem de classificação do registro de chamadas (0 = por nome, 1 = por data).</string> + <key>CameraAngle</key> + <string>Ângulo do campo de visão da câmera (radianos).</string> + <key>CameraDoFResScale</key> + <string>Quanto reduzir a resolução da profundidade de campo. Faixa válida de 0,25 (um quarto da resolução) a 1,0 (resolução total).</string> + <key>CameraFNumber</key> + <string>Valor do número f da câmera para o efeito de profundidade de campo.</string> + <key>CameraFieldOfView</key> + <string>Campo de visão vertical da câmera para o efeito de profundidade de campo (em graus).</string> + <key>CameraFocalLength</key> + <string>Distância focal da câmera para o efeito de profundidade de campo (em milímetros).</string> + <key>CameraFocusTransitionTime</key> + <string>Quantos segundos a câmera leva para transitar entre distâncias focais.</string> + <key>CameraMaxCoF</key> + <string>Círculo de confusão máximo da câmera para o efeito de profundidade de campo.</string> + <key>CameraMouseWheelZoom</key> + <string>A câmera aproxima e afasta com a roda do mouse.</string> + <key>CameraOffset</key> + <string>Renderizar com deslocamento da câmera em relação ao frustum de visão (depuração de renderização).</string> + <key>CameraOffsetBuild</key> + <string>Posição padrão da câmera em relação ao ponto de foco ao entrar no modo de construção.</string> + <key>CameraOffsetRearView</key> + <string>Deslocamento inicial da câmera em relação ao avatar na visão traseira.</string> + <key>CameraOffsetScale</key> + <string>Escala o deslocamento padrão.</string> + <key>CameraOpacity</key> + <string>Opacidade do floater de controles da câmera.</string> + <key>CameraPosOnLogout</key> + <string>Posição da câmera no último logout (coordenadas globais).</string> + <key>CameraPositionSmoothing</key> + <string>Suaviza a posição da câmera ao longo do tempo.</string> + <key>CameraPreset</key> + <string>(Obsoleto) Posição predefinida da câmera - visão (0 - traseira, 1 - frontal, 2 - grupo).</string> + <key>CameraPresetType</key> + <string>Posição predefinida da câmera - visão (0 - traseira, 1 - frontal, 2 - grupo, 3 - personalizada).</string> + <key>CameraZoomFraction</key> + <string>Fração de zoom controlada pela roda do mouse.</string> + <key>CefVerboseLog</key> + <string>Ativar/desativar log detalhado do CEF.</string> + <key>CertStore</key> + <string>Especifica o repositório de certificados para verificação de confiança de certificados.</string> + <key>ChatAutocompleteGestures</key> + <string>Autocompletar gestos no chat próximo.</string> + <key>ChatBubbleOpacity</key> + <string>Opacidade do fundo do balão de chat (0,0 = totalmente transparente, 1,0 = totalmente opaco).</string> + <key>ChatFontSize</key> + <string>Tamanho do texto no console de chat (0 = pequeno, 1 = grande).</string> + <key>ChatFullWidth</key> + <string>O console de chat ocupa toda a largura da janela do SL.</string> + <key>ChatLoadGroupMaxMembers</key> + <string>Número máximo de membros ativos que mostraremos para um grupo sem resposta.</string> + <key>ChatOnlineNotification</key> + <string>Fornecer notificações quando amigos entram e saem do SL.</string> + <key>CheesyBeacon</key> + <string>Ativar efeitos de marcador exagerados.</string> + <key>ClickToWalk</key> + <string>(obsoleto) Clicar no mundo para caminhar até o local.</string> + <key>ClientSettingsFile</key> + <string>Nome do arquivo de configurações do cliente (por instalação).</string> + <key>CloseChatOnReturn</key> + <string>Fechar o chat após pressionar Enter.</string> + <key>CmdLineChannel</key> + <string>Nome do canal especificado na linha de comando.</string> + <key>CmdLineDisableVoice</key> + <string>Desativar voz.</string> + <key>CmdLineGridChoice</key> + <string>A escolha de grade do usuário ou endereço IP.</string> + <key>CmdLineHelperURI</key> + <string>Prefixo CGI web auxiliar especificado na linha de comando a ser usado.</string> + <key>CmdLineLoginLocation</key> + <string>Destino de inicialização solicitado na linha de comando.</string> + <key>CmdLineLoginURI</key> + <string>Servidor de login e prefixo CGI especificados na linha de comando a serem usados.</string> + <key>CmdLineSkipUpdater</key> + <string>Pular verificação do atualizador via linha de comando.</string> + <key>CmdLineUpdateService</key> + <string>Substituir a URL base para a consulta de atualização.</string> + <key>CollectFontVertexBuffers</key> + <string>Quando ativado, alguns elementos de interface usam buffers de cache gerados por fontes e os reutilizam. Quando desativado, é usado um cache geral com sobrecarga significativa de hash, mas que regenera os vértices a cada quadro, ficando sempre atualizado.</string> + <key>ColorSettingsHideDefault</key> + <string>Mostrar apenas configurações não padrão na lista de Configurações de Cor.</string> + <key>ComplexityChangesPopUpDelay</key> + <string>Atraso antes de o viewer mostrar novamente o aviso de complexidade do avatar.</string> + <key>ConnectAsGod</key> + <string>Fazer login como god se você tiver acesso de god.</string> + <key>ConnectionPort</key> + <string>Número da porta de conexão personalizada.</string> + <key>ConnectionPortEnabled</key> + <string>Usar a porta de conexão personalizada?</string> + <key>ConsoleBackgroundOpacity</key> + <string>Opacidade do console de chat (0,0 = totalmente transparente, 1,0 = totalmente opaco).</string> + <key>ConsoleBufferSize</key> + <string>Tamanho do histórico do console de chat (linhas de chat).</string> + <key>ConsoleMaxLines</key> + <string>Número máximo de linhas de texto de chat visíveis no console.</string> + <key>ConversationSortOrder</key> + <string>Especifica a chave de classificação das conversas.</string> + <key>ConversationsExpandMessagePaneFirst</key> + <string>Expandir o painel de mensagens ou o de conversas ao sair do modo compacto de Conversas.</string> + <key>ConversationsListPaneCollapsed</key> + <string>Armazena o estado expandido/recolhido do painel de lista de conversas no floater Conversas.</string> + <key>ConversationsListPaneWidth</key> + <string>Largura do painel de lista no floater Conversas.</string> + <key>ConversationsMessagePaneCollapsed</key> + <string>Armazena o estado expandido/recolhido do painel de mensagens no floater Conversas.</string> + <key>ConversationsMessagePaneWidth</key> + <string>Largura do painel de mensagens no floater Conversas.</string> + <key>ConversationsParticipantListCollapsed</key> + <string>Armazena o estado expandido/recolhido da lista de participantes do chat próximo.</string> + <key>CookiesEnabled</key> + <string>Aceitar cookies de sites?</string> + <key>CoroutineStackSize</key> + <string>Tamanho (em bytes) de cada pilha de corrotina.</string> + <key>CrashHostUrl</key> + <string>URL apontando para um manipulador de relatórios de crash; substitui a negociação de cluster para localizar o manipulador de crash.</string> + <key>CrashOnStartup</key> + <string>Crash solicitado pelo usuário na inicialização do viewer.</string> + <key>CreateToolCopyCenters</key> + <string>Copiar mantendo os centros alinhados ao usar a ferramenta de criação.</string> + <key>CreateToolCopyRotates</key> + <string>Copiar mantendo as rotações ao usar a ferramenta de criação.</string> + <key>CreateToolCopySelection</key> + <string>Copiar a seleção ao usar a ferramenta de criação.</string> + <key>CreateToolKeepSelected</key> + <string>Após usar a ferramenta de criação, manter a ferramenta de criação ativa.</string> + <key>CurlRequestTimeOut</key> + <string>Tempo máximo de inatividade de uma requisição curl antes de ser encerrada (requer reinício).</string> + <key>CurrentGrid</key> + <string>Grade selecionada no momento.</string> + <key>CurrentMapServerURL</key> + <string>URL do mapa-múndi da sessão atual.</string> + <key>Cursor3D</key> + <string>Tratar os valores do joystick como posições absolutas (não deltas).</string> + <key>DebugAnimatedObjects</key> + <string>Mostrar informações relacionadas a objetos animados.</string> + <key>DebugAvatarAppearanceMessage</key> + <string>Despejar vários arquivos XML ao tratar mensagens de aparência.</string> + <key>DebugAvatarAppearanceServiceURLOverride</key> + <string>URL a usar para requisições de texturas assadas; substitui o valor retornado pelo servidor de login.</string> + <key>DebugAvatarCompositeBaked</key> + <string>Colorir as malhas do avatar com base no estado assado/composto.</string> + <key>DebugAvatarExperimentalServerAppearanceUpdate</key> + <string>Experimentar enviar o cof_contents completo em vez do cof_version.</string> + <key>DebugAvatarJoints</key> + <string>Lista de juntas sobre as quais emitir informações adicionais de depuração.</string> + <key>DebugAvatarLocalTexLoadedTime</key> + <string>Exibir o tempo de carregamento das texturas locais do avatar.</string> + <key>DebugAvatarRezTime</key> + <string>Exibir os tempos para os avatares carregarem.</string> + <key>DebugBeaconLineWidth</key> + <string>Tamanho das linhas dos marcadores de depuração.</string> + <key>DebugForceAppearanceRequestFailure</key> + <string>Solicitar a versão de cof errada para testar o caminho de falha das requisições de atualização de aparência do servidor.</string> + <key>DebugHideEmptySystemFolders</key> + <string>Ocultar pastas de sistema vazias quando ativado.</string> + <key>DebugObjectLODs</key> + <string>Mostrar informações relacionadas aos cálculos de LOD para objetos anexados ou animados.</string> + <key>DebugPermissions</key> + <string>Registrar permissões dos itens de inventário selecionados.</string> + <key>DebugPluginDisableTimeout</key> + <string>Desativar o código que monitora plugins travados ou que sofreram crash.</string> + <key>DebugQualityPerformance</key> + <string>Permite alterar a qualidade de desempenho diretamente pelas configurações de depuração.</string> + <key>DebugSelectionLODs</key> + <string>Forçar a seleção a mostrar um LOD específico, -1 para desligado, 0 - mais baixo, 4 - alto.</string> + <key>DebugSession</key> + <string>Solicitar depuração para uma sessão específica do viewer.</string> + <key>DebugSettingsHideDefault</key> + <string>Mostrar apenas configurações não padrão na lista de Debug Settings.</string> + <key>DebugShowAvatarRenderInfo</key> + <string>Mostrar informações de custo de renderização do avatar.</string> + <key>DebugShowColor</key> + <string>Mostrar a cor sob o cursor.</string> + <key>DebugShowMemory</key> + <string>Mostrar a memória total alocada.</string> + <key>DebugShowRenderInfo</key> + <string>Mostrar estatísticas sobre a cena atual.</string> + <key>DebugShowRenderMatrices</key> + <string>Exibir os valores das matrizes de visão e projeção atuais.</string> + <key>DebugShowTextureInfo</key> + <string>Mostrar informações da textura de interesse.</string> + <key>DebugShowTime</key> + <string>Mostrar informações de tempo.</string> + <key>DebugShowUploadCost</key> + <string>Mostrar o custo de upload de malha.</string> + <key>DebugShowXUINames</key> + <string>Mostrar dicas com o caminho XUI do widget.</string> + <key>DebugStatModeSimAgentMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador com agentes (avatares) no painel de Estatísticas.</string> + <key>DebugStatModeSimFrameMsec</key> + <string>Modo de exibição da estatística de tempo total de quadro do simulador no painel de Estatísticas.</string> + <key>DebugStatModeSimImagesMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador com imagens/texturas no painel de Estatísticas.</string> + <key>DebugStatModeSimNetMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador com a rede no painel de Estatísticas.</string> + <key>DebugStatModeSimPumpIOMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador com operações de E/S (pump I/O) no painel de Estatísticas.</string> + <key>DebugStatModeSimScriptMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador executando scripts no painel de Estatísticas.</string> + <key>DebugStatModeSimSimOtherMsec</key> + <string>Modo de exibição da estatística de tempo gasto pelo simulador com outras tarefas no painel de Estatísticas.</string> + <key>DebugStatModeSimSimPhysicsMsec</key> + <string>Modo de exibição da estatística de tempo total de física do simulador no painel de Estatísticas.</string> + <key>DebugStatModeSimSimPhysicsOtherMsec</key> + <string>Modo de exibição da estatística de tempo gasto com outras tarefas de física no painel de Estatísticas.</string> + <key>DebugStatModeSimSimPhysicsShapeUpdateMsec</key> + <string>Modo de exibição da estatística de tempo gasto atualizando formas de colisão da física no painel de Estatísticas.</string> + <key>DebugStatModeSimSimPhysicsStepMsec</key> + <string>Modo de exibição da estatística de tempo gasto no passo de simulação da física no painel de Estatísticas.</string> + <key>DebugStatModeSimSleepMsec</key> + <string>Modo de exibição da estatística de tempo de espera (sleep) do simulador por quadro no painel de Estatísticas.</string> + <key>DebugStatModeSimSpareMsec</key> + <string>Modo de exibição da estatística de tempo ocioso (sobressalente) do simulador por quadro no painel de Estatísticas.</string> + <key>DebugStatModeSimTotalUnackedBytes</key> + <string>Modo de exibição da estatística de total de bytes não confirmados (unacked) na rede no painel de Estatísticas.</string> + <key>DebugViews</key> + <string>Exibir informações de depuração para as views.</string> + <key>DebugWindowProc</key> + <string>Registrar mensagens do Windows.</string> + <key>DeepLTranslateAPIKey</key> + <string>Dados do serviço de tradução DeepL para uso com a API do DeepL Translator.</string> + <key>DefaultFemaleAvatar</key> + <string>Avatar feminino padrão.</string> + <key>DefaultLoginLocation</key> + <string>Destino de inicialização padrão (se não especificado na linha de comando).</string> + <key>DefaultMaleAvatar</key> + <string>Avatar masculino padrão.</string> + <key>DefaultUploadPermissionsConverted</key> + <string>As permissões de upload padrão foram convertidas em permissões de criação padrão.</string> + <key>DestinationGuideURL</key> + <string>Conteúdo do guia de destinos.</string> + <key>DisableAllRenderFeatures</key> + <string>Desativa todos os recursos de renderização.</string> + <key>DisableAllRenderTypes</key> + <string>Desativa todos os tipos de renderização.</string> + <key>DisableCameraConstraints</key> + <string>Desativar os limites normais impostos à câmera pela posição do avatar.</string> + <key>DisableCrashLogger</key> + <string>Não enviar relatório de crash ao servidor da Linden.</string> + <key>DisableExternalBrowser</key> + <string>Desativar a abertura de um navegador externo.</string> + <key>DisableLookAtAnimation</key> + <string>O avatar segue o cursor com os olhos; quando desativado, o avatar olha para a frente.</string> + <key>DisableTextHyperlinkActions</key> + <string>Desativar destaque e criação de links de URLs em caixas de texto XUI.</string> + <key>DiskCacheDirName</key> + <string>Nome do cache em disco (dentro do diretório padrão de cache em disco do Viewer).</string> + <key>DiskCachePercentOfTotal</key> + <string>Percentual do tamanho total do cache (definido por CacheSize) a usar para o cache em disco (ex.: armazenamento de assets, exclui texturas).</string> + <key>DiskCacheVersion</key> + <string>Número da versão do cache em disco.</string> + <key>DisplayTimecode</key> + <string>Exibir o timecode na tela.</string> + <key>Disregard128DefaultDrawDistance</key> + <string>Se deve usar o padrão automático de 128 de distância de desenho.</string> + <key>Disregard96DefaultDrawDistance</key> + <string>Se deve usar o padrão automático de 96 de distância de desenho.</string> + <key>DoNotDisturbModeResponse</key> + <string>Resposta automática a mensagens instantâneas no modo Não Perturbe.</string> + <key>DoNotDisturbResponseChanged</key> + <string>A mensagem do modo Não Perturbe do usuário difere do padrão?</string> + <key>DoubleClickAutoPilot</key> + <string>(Obsoleto) Ativar piloto automático com duplo clique.</string> + <key>DoubleClickShowWorldMap</key> + <string>Ativar duplo clique para mostrar o mapa-múndi a partir do minimapa.</string> + <key>DoubleClickTeleport</key> + <string>Ativar duplo clique para teletransportar onde permitido (afeta o minimapa e o painel de pessoas).</string> + <key>DynamicCameraStrength</key> + <string>Quanto a câmera atrasa em relação ao movimento do avatar (0 = nenhum, 30 = velocidade do avatar).</string> + <key>EditCameraMovement</key> + <string>Ao entrar no modo de construção, a câmera sobe acima do avatar.</string> + <key>EditLinkedParts</key> + <string>Selecionar partes individuais de objetos vinculados.</string> + <key>EffectScriptChatParticles</key> + <string>1 = comportamento normal, 0 = desativar a exibição das luzes giratórias quando scripts se comunicam.</string> + <key>EmulateCoreCount</key> + <string>Para depuração -- número de núcleos aos quais restringir o processo principal, ou 0 para sem limite. Requer reinício.</string> + <key>EnableAltZoom</key> + <string>Usar Alt+mouse para olhar e aproximar objetos.</string> + <key>EnableAppearance</key> + <string>Ativar a abertura da aparência a partir de link web.</string> + <key>EnableAvatarPay</key> + <string>Ativar o pagamento a outros avatares a partir de link web.</string> + <key>EnableAvatarShare</key> + <string>Ativar compartilhamento a partir de link web.</string> + <key>EnableButtonFlashing</key> + <string>Permitir que a interface pisque botões para chamar sua atenção.</string> + <key>EnableClassifieds</key> + <string>Ativar a criação de novos anúncios classificados a partir de link web.</string> + <key>EnableCollisionSounds</key> + <string>Reproduzir sons em colisões.</string> + <key>EnableDiscord</key> + <string>Quando ativado, conecta ao Discord para habilitar o Rich Presence.</string> + <key>EnableDiskCacheDebugInfo</key> + <string>Quando ativado, exibir informações adicionais de depuração do cache.</string> + <key>EnableGestureSounds</key> + <string>Reproduzir sons de gestos.</string> + <key>EnableGrab</key> + <string>Usar Ctrl+mouse para agarrar e manipular objetos.</string> + <key>EnableGroupChatPopups</key> + <string>Ativar pop-ups de chat de grupo recebidos.</string> + <key>EnableInventory</key> + <string>Ativar a abertura do inventário a partir de link web.</string> + <key>EnableLookAtTarget</key> + <string>Se deve ou não animar a cabeça do avatar e enviar alvos de olhar ao mover o cursor ou focar em objetos.</string> + <key>EnableMouselook</key> + <string>Permitir perspectiva em primeira pessoa e controle da câmera pelo mouse.</string> + <key>EnablePlaceProfile</key> + <string>Ativar a visualização do perfil do lugar a partir de link web.</string> + <key>EnableSelectionHints</key> + <string>Se deve ou não enviar dicas de edição para animar o braço ao editar um objeto.</string> + <key>EnableUIHints</key> + <string>Alterna os pop-ups de dicas da interface.</string> + <key>EnableVisualLeakDetector</key> + <string>Ativar o Visual Leak Detector.</string> + <key>EnableVoiceChat</key> + <string>Ativar conversa com outros residentes usando microfone.</string> + <key>EnvironmentPersistAcrossLogin</key> + <string>Manter as configurações de ambiente consistentes entre sessões.</string> + <key>EventURL</key> + <string>URL do site de eventos, exibida no floater de eventos.</string> + <key>EveryoneCopy</key> + <string>(obsoleto) Todos podem copiar os objetos recém-criados.</string> + <key>ExperienceSearchMaturity</key> + <string>Classificação máxima de conteúdo preferida pelo usuário na busca de Experiências (padrão: General).</string> + <key>ExternalEditor</key> + <string>Caminho do programa usado para editar scripts LSL e arquivos XUI, ex.: /usr/bin/gedit --new-window "%s".</string> + <key>FMODExDecodeBufferSize</key> + <string>Define o tamanho do buffer de decodificação de streaming (em milissegundos) para o FMOD Ex ou FMOD Studio.</string> + <key>FMODExProfilerEnable</key> + <string>Ativar ferramenta de profiler ao usar FMOD Ex ou FMOD Studio.</string> + <key>FakeInitialOutfitName</key> + <string>Fingir que este é o primeiro login e que o nome especificado foi escolhido.</string> + <key>FetchGroupChatHistory</key> + <string>Buscar mensagens recentes dos servidores de chat de grupo ao abrir uma janela de grupo.</string> + <key>FindLandArea</key> + <string>Ativa a filtragem dos resultados de busca de terrenos por área.</string> + <key>FindLandPrice</key> + <string>Ativa a filtragem dos resultados de busca de terrenos por preço.</string> + <key>FindOriginalOpenWindow</key> + <string>Define a ação para 'Encontrar original' e 'Mostrar no Inventário' (0 - mostra o item no Inventário principal, 1 - abre uma nova janela de pasta única).</string> + <key>FirstLoginThisInstall</key> + <string>Especifica que você não fez login com o viewer desde que realizou uma instalação limpa.</string> + <key>FirstName</key> + <string>Primeiro nome de login.</string> + <key>FirstPersonAvatarVisible</key> + <string>Exibir avatar e anexos abaixo do pescoço enquanto em mouselook.</string> + <key>FirstRunThisInstall</key> + <string>Especifica que você não executou o viewer desde que realizou uma instalação limpa.</string> + <key>FirstSelectedDisabledPopups</key> + <string>Retorna falso se não houver pop-up desativado selecionado na lista de pop-ups das preferências de floaters.</string> + <key>FirstSelectedEnabledPopups</key> + <string>Retorna falso se não houver pop-up ativado selecionado na lista de pop-ups das preferências de floaters.</string> + <key>FixedWeather</key> + <string>Os efeitos climáticos não mudam ao longo do tempo.</string> + <key>FlashCount</key> + <string>Número de piscadas do item. Requer reinício.</string> + <key>FlashPeriod</key> + <string>Período em que o item pisca (segundos). Requer reinício.</string> + <key>FloaterActiveSpeakersSortAscending</key> + <string>Se deve classificar em ordem crescente ou decrescente.</string> + <key>FloaterActiveSpeakersSortColumn</key> + <string>Nome da coluna pela qual classificar.</string> + <key>FloaterMapEast</key> + <string>Rótulo Leste do floater do mapa.</string> + <key>FloaterMapNorth</key> + <string>Rótulo Norte do floater do mapa.</string> + <key>FloaterMapNorthEast</key> + <string>Rótulo Nordeste do floater do mapa.</string> + <key>FloaterMapNorthWest</key> + <string>Rótulo Noroeste do floater do mapa.</string> + <key>FloaterMapSouth</key> + <string>Rótulo Sul do floater do mapa.</string> + <key>FloaterMapSouthEast</key> + <string>Rótulo Sudeste do floater do mapa.</string> + <key>FloaterMapSouthWest</key> + <string>Rótulo Sudoeste do floater do mapa.</string> + <key>FloaterMapWest</key> + <string>Rótulo Oeste do floater do mapa.</string> + <key>FloaterStatisticsRect</key> + <string>Retângulo do histórico de chat.</string> + <key>FlycamAbsolute</key> + <string>Tratar os valores da Flycam como posições absolutas (não deltas).</string> + <key>FlycamAxisDeadZone0</key> + <string>Zona morta do eixo Z (movimento vertical) da Flycam.</string> + <key>FlycamAxisDeadZone1</key> + <string>Zona morta do eixo X (movimento lateral) da Flycam.</string> + <key>FlycamAxisDeadZone2</key> + <string>Zona morta do eixo Y (movimento para frente/trás) da Flycam.</string> + <key>FlycamAxisDeadZone3</key> + <string>Zona morta da rolagem (roll) da Flycam.</string> + <key>FlycamAxisDeadZone4</key> + <string>Zona morta da elevação (pitch) da Flycam.</string> + <key>FlycamAxisDeadZone5</key> + <string>Zona morta da guinada (yaw) da Flycam.</string> + <key>FlycamAxisDeadZone6</key> + <string>Zona morta do zoom da Flycam.</string> + <key>FlycamAxisScale0</key> + <string>Fator de escala do eixo Z (movimento vertical) da Flycam.</string> + <key>FlycamAxisScale1</key> + <string>Fator de escala do eixo X (movimento lateral) da Flycam.</string> + <key>FlycamAxisScale2</key> + <string>Fator de escala do eixo Y (movimento para frente/trás) da Flycam.</string> + <key>FlycamAxisScale3</key> + <string>Fator de escala da rolagem (roll) da Flycam.</string> + <key>FlycamAxisScale4</key> + <string>Fator de escala da elevação (pitch) da Flycam.</string> + <key>FlycamAxisScale5</key> + <string>Fator de escala da guinada (yaw) da Flycam.</string> + <key>FlycamAxisScale6</key> + <string>Fator de escala do zoom da Flycam.</string> + <key>FlycamBuildModeScale</key> + <string>Fator de escala a aplicar aos movimentos da Flycam no modo de construção.</string> + <key>FlycamFeathering</key> + <string>Suavização da Flycam (menos é mais suave).</string> + <key>FlyingAtExit</key> + <string>Estava voando no último logout, então voar ao fazer login.</string> + <key>FocusOffsetRearView</key> + <string>Deslocamento inicial do ponto de foco em relação ao avatar para a predefinição de câmera Visão Traseira (o eixo x é para frente).</string> + <key>FocusPosOnLogout</key> + <string>Ponto de foco da câmera no último logout (coordenadas globais).</string> + <key>FolderAutoOpenDelay</key> + <string>Segundos antes de expandir automaticamente a pasta sob o mouse ao arrastar e soltar itens no inventário.</string> + <key>FontScreenDPI</key> + <string>Resolução da fonte; maior é maior (pixels por polegada).</string> + <key>ForceAddressSize</key> + <string>Forçar a atualização do Windows para o viewer de 32 bits ou 64 bits.</string> + <key>ForceAssetFail</key> + <string>Forçar a falha das buscas de wearables para este tipo de asset.</string> + <key>ForceLoginURL</key> + <string>Forçar uma URL específica para o conteúdo da página de login - usada se existir.</string> + <key>ForceShowGrid</key> + <string>Sempre mostrar a lista suspensa de grades na tela de login.</string> + <key>FreezeTime</key> + <string>Congela o tempo de renderização (animações e atualizações de cena pausadas).</string> + <key>FriendsListHideUsernames</key> + <string>Mostrar tanto o nome de exibição quanto o nome de usuário na lista de amigos.</string> + <key>FriendsListShowIcons</key> + <string>Mostrar/ocultar ícones de online e de todos os amigos na lista de amigos.</string> + <key>FriendsListShowPermissions</key> + <string>Mostrar/ocultar ícones de permissão na lista de amigos.</string> + <key>FriendsSortOrder</key> + <string>Especifica a ordem de classificação dos amigos (0 = por nome, 1 = por status online).</string> + <key>FullScreen</key> + <string>Executar uma sessão em tela cheia. Não suportado no MacOS.</string> + <key>FullScreenAspectRatio</key> + <string>Proporção de tela da exibição em tela cheia (largura / altura).</string> + <key>FullScreenAutoDetectAspectRatio</key> + <string>Detectar automaticamente a proporção de tela correta para exibição em tela cheia.</string> + <key>GLTFEnabled</key> + <string>Ativar suporte a GLTF. Definido como verdadeiro pelo simulador se o simulador ao qual você está conectado suportar upload de assets GLTF. AVISO: definir manualmente como verdadeiro ativará botões que podem esgotar seu saldo de L$ ao fazer upload implícito de texturas sem perguntar.</string> + <key>GenericErrorPageURL</key> + <string>URL a definir como propriedade no LLMediaControl para navegar caso a página finalize com um status HTTP 400-499.</string> + <key>GesturesEveryoneCopy</key> + <string>Todos podem copiar o gesto recém-criado.</string> + <key>GesturesMarketplaceURL</key> + <string>URL do Marketplace de Gestos.</string> + <key>GesturesNextOwnerCopy</key> + <string>Gestos recém-criados podem ser copiados pelo próximo proprietário.</string> + <key>GesturesNextOwnerModify</key> + <string>Gestos recém-criados podem ser modificados pelo próximo proprietário.</string> + <key>GesturesNextOwnerTransfer</key> + <string>Gestos recém-criados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>GesturesShareWithGroup</key> + <string>Gestos recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>GoogleTranslateAPIKey</key> + <string>Chave da API do Google Translate.</string> + <key>GridCrossSections</key> + <string>Destacar seções transversais de prims com o plano de manipulação da grade.</string> + <key>GridDrawSize</key> + <string>Extensão visível da grade de encaixe 2D (metros).</string> + <key>GridMode</key> + <string>Quadro de referência da grade de encaixe (0 = mundo, 1 = local, 2 = objeto de referência).</string> + <key>GridOpacity</key> + <string>Opacidade das linhas da grade (0,0 = totalmente transparente, 1,0 = totalmente opaco).</string> + <key>GridResolution</key> + <string>Tamanho de um único passo da grade (metros).</string> + <key>GridStatusFloaterRect</key> + <string>Dimensões do floater de perfil web.</string> + <key>GridStatusRSS</key> + <string>URL que aponta para o RSS de Status da Grade do SL.</string> + <key>GridStatusUpdateDelay</key> + <string>Atraso do temporizador para atualizar o RSS de Status da Grade.</string> + <key>GridSubUnit</key> + <string>Exibir passos fracionários da grade, relativos ao tamanho da grade.</string> + <key>GridSubdivision</key> + <string>Número máximo de vezes para dividir uma unidade da grade de encaixe quando GridSubUnit é verdadeiro.</string> + <key>GroupListShowIcons</key> + <string>Mostrar/ocultar ícones de grupo na lista de grupos.</string> + <key>GroupMembersSortOrder</key> + <string>A ordem pela qual os membros do grupo serão classificados (name|donated|online).</string> + <key>GroupTitlesTagMode</key> + <string>Selecionar o modo de etiqueta de títulos de grupo: 0 - sem etiquetas de grupo, 1 - apenas a etiqueta do meu grupo, 2 - todas as etiquetas de grupo.</string> + <key>HUDScaleFactor</key> + <string>Escala dos anexos de HUD.</string> + <key>HeadlessClient</key> + <string>Executar em modo headless desativando a renderização GL, o teclado, etc.</string> + <key>HeightUnits</key> + <string>Determina quais unidades métricas são usadas: 1(TRUE) para metro e 0(FALSE) para pé.</string> + <key>HelpFloaterOpen</key> + <string>Mostrar o floater de Ajuda no login?</string> + <key>HelpURLFormat</key> + <string>Padrão de URL para a página de ajuda; os argumentos serão codificados; veja llviewerhelp.cpp:buildHelpURL para os argumentos.</string> + <key>HideSelectedObjects</key> + <string>Ocultar objetos selecionados.</string> + <key>HideUIControls</key> + <string>Ocultar todos os itens de menu e botões.</string> + <key>HighResSnapshot</key> + <string>Dobrar a resolução da captura em relação à resolução atual da janela.</string> + <key>HomeSidePanelURL</key> + <string>URL da página web a exibir no painel lateral Início.</string> + <key>HostID</key> + <string>Identificador de máquina para instâncias hospedadas do Second Life.</string> + <key>HoverHeightAffectsCamera</key> + <string>A visão da câmera é afetada pela configuração de altura de flutuação.</string> + <key>HttpPipelining</key> + <string>Se verdadeiro, o viewer tentará usar pipelining nas requisições HTTP.</string> + <key>HttpProxyType</key> + <string>Tipo de proxy a usar nas operações HTTP.</string> + <key>HttpRangeRequestsDisable</key> + <string>Se verdadeiro, o viewer não emitirá requisições GET com cabeçalhos 'Range:' para malhas e texturas. Pode resolver problemas com certos provedores e equipamentos de rede.</string> + <key>IMShowControlPanel</key> + <string>Mostrar o painel de controle de IM.</string> + <key>IMShowNamesForP2PConv</key> + <string>Ativar/desativar exibição de nomes no chat.</string> + <key>IMShowTime</key> + <string>Ativar/desativar exibição de carimbo de data/hora no chat.</string> + <key>IgnoreAllNotifications</key> + <string>Ignorar todas as notificações para que nunca precisemos da entrada do usuário nelas.</string> + <key>IgnoreFOVZoomForLODs</key> + <string>Ignorar o efeito de zoom (CTRL+0) ao calcular os LODs.</string> + <key>IgnorePixelDepth</key> + <string>Ignorar as configurações de profundidade de pixel.</string> + <key>ImagePipelineUseHTTP</key> + <string>Se TRUE, usar HTTP GET para buscar texturas do servidor.</string> + <key>ImporterDebugMode</key> + <string>Em 0 não faz nada; em 1 exporta dados de skinning perto do arquivo original; em 2 exporta dados de skinning e posições/pesos dos 5 primeiros modelos; em 3 exporta dados de skinning e modelos como llsd.</string> + <key>ImporterDebugVerboseLogging</key> + <string>Ativa saída de depuração para identificar com mais precisão as fontes de erros de importação. Aviso: a saída pode deixar a importação lenta em muitas máquinas.</string> + <key>ImporterLegacyMatching</key> + <string>Ativa correspondência de modelos baseada em índice.</string> + <key>ImporterModelLimit</key> + <string>Limita a quantidade de modelos gerados pelo importador (quando há mais de 8 faces) para arquivos dae e gltf.</string> + <key>ImporterPreprocessDAE</key> + <string>Ativa pré-processamento de arquivos DAE para corrigir alguns problemas relacionados ao ColladaDOM (como suporte a espaços em nomes e ids).</string> + <key>InBandwidth</key> + <string>Limite de largura de banda de entrada (bps).</string> + <key>InactiveFloaterTransparency</key> + <string>Transparência de floaters inativos (floaters sem foco).</string> + <key>IndirectMaxComplexity</key> + <string>Controla RenderAvatarMaxComplexity de forma não linear (não defina este valor).</string> + <key>IndirectMaxNonImpostors</key> + <string>Controla RenderAvatarMaxNonImpostors de forma não linear (não defina este valor).</string> + <key>InstallLanguage</key> + <string>Idioma passado pelo instalador (para a interface).</string> + <key>InstantMessageLogPath</key> + <string>Caminho para seus arquivos de log.</string> + <key>InterpolationPhaseOut</key> + <string>Segundos para eliminar gradualmente o movimento interpolado.</string> + <key>InterpolationTime</key> + <string>Por quanto tempo extrapolar o movimento do objeto após o último pacote recebido.</string> + <key>InventoryAddAttachmentBehavior</key> + <string>Define o comportamento ao pressionar Enter em um item de inventário.</string> + <key>InventoryAutoOpenDelay</key> + <string>Segundos antes de abrir automaticamente o inventário quando o mouse está sobre o botão de inventário ao arrastar e soltar itens.</string> + <key>InventoryDebugSimulateLateOpRate</key> + <string>Taxa na qual simulamos requisições de cópia/link que se completam tarde em algumas operações.</string> + <key>InventoryDebugSimulateOpFailureRate</key> + <string>Taxa na qual simulamos falhas de requisições de cópia/link em algumas operações.</string> + <key>InventoryDisplayInbox</key> + <string>Substituir a exibição da caixa de entrada de itens recebidos do inventário.</string> + <key>InventoryExposeFolderID</key> + <string>Permite copiar o id da pasta pelo menu de contexto.</string> + <key>InventoryFavoritesColorText</key> + <string>Renderizar itens favoritos usando InventoryFavoriteText como cor.</string> + <key>InventoryFavoritesUseHollowStar</key> + <string>Mostrar estrela perto de pastas que contêm favoritos.</string> + <key>InventoryFavoritesUseStar</key> + <string>Mostrar estrela perto de itens favoritados no inventário.</string> + <key>InventoryInboxHeight</key> + <string>Altura do painel de caixa de entrada do inventário no floater Inventário.</string> + <key>InventoryInboxToggleState</key> + <string>Armazena o estado aberto/fechado do painel Itens Recebidos do inventário.</string> + <key>InventoryLinking</key> + <string>Ativar a capacidade de criar links para pastas e itens via "Colar como link".</string> + <key>InventoryOutboxLogging</key> + <string>Ativar saída de depuração associada à Caixa de Saída do Comerciante.</string> + <key>InventoryOutboxMakeVisible</key> + <string>Ativar a exibição da Caixa de Saída e de Entrada do Comerciante no inventário para fins de depuração.</string> + <key>InventoryOutboxMaxFolderCount</key> + <string>Número máximo de subpastas permitidas em uma listagem na caixa de saída do comerciante.</string> + <key>InventoryOutboxMaxFolderDepth</key> + <string>Número máximo de níveis aninhados de subpastas permitidos em uma listagem na caixa de saída do comerciante.</string> + <key>InventoryOutboxMaxItemCount</key> + <string>Número máximo de itens permitidos em uma listagem na caixa de saída do comerciante.</string> + <key>InventoryOutboxMaxStockItemCount</key> + <string>Número máximo de itens permitidos em uma pasta de estoque.</string> + <key>InventoryShowFavoritesTab</key> + <string>Mostrar/ocultar a aba Favoritos no floater de Inventário.</string> + <key>InventoryShowRecentTab</key> + <string>Mostrar/ocultar a aba Recentes no floater de Inventário.</string> + <key>InventoryShowWornTab</key> + <string>Mostrar/ocultar a aba Em uso no floater de Inventário.</string> + <key>InventorySortOrder</key> + <string>Especifica a chave de classificação dos itens de inventário (+0 = nome, +1 = data, +2 = pastas sempre por nome, +4 = pastas de sistema no topo).</string> + <key>InventoryTrashMaxCapacity</key> + <string>Capacidade máxima da pasta Lixeira. O usuário será convidado a esvaziá-la quando excedida.</string> + <key>InvertMouse</key> + <string>Em mouselook, mover o mouse para cima olha para baixo e vice-versa (FALSE = mover para cima olha para cima).</string> + <key>JoystickAvatarEnabled</key> + <string>Ativa o joystick para controlar o movimento do avatar.</string> + <key>JoystickAxis0</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 0 ([0, 5]).</string> + <key>JoystickAxis1</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 1 ([0, 5]).</string> + <key>JoystickAxis2</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 2 ([0, 5]).</string> + <key>JoystickAxis3</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 3 ([0, 5]).</string> + <key>JoystickAxis4</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 4 ([0, 5]).</string> + <key>JoystickAxis5</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 5 ([0, 5]).</string> + <key>JoystickAxis6</key> + <string>Mapeamento de eixo de hardware da Flycam para o eixo interno 6 ([0, 5]).</string> + <key>JoystickBuildEnabled</key> + <string>Ativa o joystick para mover objetos editados.</string> + <key>JoystickDeviceUUID</key> + <string>ID do dispositivo preferido.</string> + <key>JoystickEnabled</key> + <string>Ativa a entrada por joystick.</string> + <key>JoystickFlycamEnabled</key> + <string>Ativa o joystick para controlar a Flycam.</string> + <key>JoystickInitialized</key> + <string>Se um joystick foi ou não detectado e inicializado.</string> + <key>JoystickMouselookYaw</key> + <string>Passar o yaw do joystick para scripts no modo mouselook.</string> + <key>JoystickRunThreshold</key> + <string>Limiar de entrada para iniciar a corrida.</string> + <key>Jpeg2000AdvancedCompression</key> + <string>Usar opções avançadas de compressão Jpeg2000 (precincts, blocos, ordenação, marcadores).</string> + <key>Jpeg2000BlocksSize</key> + <string>Tamanho dos blocos de codificação. Assumidos quadrados e iguais para todos os níveis. Deve ser potência de 2. Máx 64, Mín 4.</string> + <key>Jpeg2000PrecinctsSize</key> + <string>Tamanho dos precincts da imagem. Assumidos quadrados e iguais para todos os níveis. Deve ser potência de 2.</string> + <key>KeepAspectForSnapshot</key> + <string>Usar a janela inteira ao tirar a captura, independentemente do tamanho de imagem solicitado.</string> + <key>KeepAutoTuneLock</key> + <string>Quando ativado, o AutoTuneLock será mantido em todas as sessões seguintes.</string> + <key>KeepConversationLogTranscripts</key> + <string>Manter log e transcrições de conversas: 2 - ambos, 1 - logs, 0 - nenhum.</string> + <key>LSLFindCaseInsensitivity</key> + <string>Usar busca sem distinção de maiúsculas/minúsculas no editor LSL.</string> + <key>LSLFontSizeName</key> + <string>Tamanho da fonte do texto no editor LSL.</string> + <key>LSLHelpURL</key> + <string>URL que aponta para os arquivos de ajuda do LSL, com [LSL_STRING] correspondendo à função ou palavra-chave LSL referenciada.</string> + <key>LagMeterShrunk</key> + <string>Último estado grande/pequeno do medidor de lag.</string> + <key>LandBrushForce</key> + <string>Multiplicador da força do pincel de modificação de terreno.</string> + <key>LandBrushSize</key> + <string>Tamanho da região afetada ao usar a ferramenta de terraformação.</string> + <key>LandmarksSortedByDate</key> + <string>Reflete a ordem de classificação do painel de landmarks.</string> + <key>Language</key> + <string>Idioma do viewer.</string> + <key>LanguageIsPublic</key> + <string>Deixar outros residentes verem as informações do nosso idioma.</string> + <key>LastAppearanceTab</key> + <string>Última aba selecionada no floater de aparência.</string> + <key>LastFeatureVersion</key> + <string>[NÃO MODIFICAR] Número da versão da tabela de recursos para rastrear mudanças no sistema de renderização.</string> + <key>LastFindPanel</key> + <string>Controla qual operação de busca aparece por padrão ao clicar no botão "Buscar".</string> + <key>LastGPUString</key> + <string>[NÃO MODIFICAR] string anterior de id da GPU para rastrear mudanças de hardware.</string> + <key>LastInventoryInboxActivity</key> + <string>Última vez que a caixa de entrada de itens recebidos foi acessada pelo usuário.</string> + <key>LastLogoff</key> + <string>Último logout.</string> + <key>LastMediaSettingsTab</key> + <string>Última aba selecionada na janela de configurações de mídia.</string> + <key>LastName</key> + <string>Sobrenome de login.</string> + <key>LastPostcardRecipient</key> + <string>Último destinatário de cartão postal.</string> + <key>LastPrefTab</key> + <string>Última aba selecionada na janela de preferências.</string> + <key>LastRunVersion</key> + <string>Número da versão da última instância do viewer que você executou.</string> + <key>LastUIFeatureVersion</key> + <string>Número da versão de recursos de interface para rastrear notificações de recursos entre builds do viewer.</string> + <key>LeapCommand</key> + <string>Zero ou mais linhas de comando para executar programas do LLSD Event API Plugin.</string> + <key>LeapPlaybackEventsCommand</key> + <string>Linha de comando para usar o leap para iniciar a reprodução de gravações de eventos.</string> + <key>LeaveMouselook</key> + <string>Sair do modo mouselook com as teclas S ou Seta para Baixo enquanto sentado.</string> + <key>LetterKeysFocusChatBar</key> + <string>Quando teclas de caracteres imprimíveis (possivelmente com Shift) são pressionadas, a barra de chat recebe o foco.</string> + <key>LimitDragDistance</key> + <string>Limitar a translação do objeto pela ferramenta de mover.</string> + <key>LimitLookAtTarget</key> + <string>Se deve ou não limitar os alvos de olhar ao redor da cabeça do avatar antes de enviar.</string> + <key>LimitLookAtTargetDistance</key> + <string>Distância para limitar o alvo de olhar.</string> + <key>LimitSelectDistance</key> + <string>Não permitir a seleção de objetos além da distância máxima de seleção.</string> + <key>LinkReplaceBatchPauseTime</key> + <string>O tempo em segundos entre dois lotes em uma operação de substituição de link.</string> + <key>LinkReplaceBatchSize</key> + <string>O tamanho máximo de um lote em uma operação de substituição de link.</string> + <key>LipSyncAah</key> + <string>Loop de balbucio Aah (abertura da mandíbula).</string> + <key>LipSyncAahPowerTransfer</key> + <string>Curva de transferência da potência da interface de voz para a amplitude de sincronia labial aah.</string> + <key>LipSyncEnabled</key> + <string>0 desativa a sincronia labial, 1 ativa o loop de balbucio.</string> + <key>LipSyncOoh</key> + <string>Loop de balbucio Ooh (largura da boca).</string> + <key>LipSyncOohAahRate</key> + <string>Taxa de balbucio de Ooh e Aah (/seg).</string> + <key>LipSyncOohPowerTransfer</key> + <string>Curva de transferência da potência da interface de voz para a amplitude de sincronia labial ooh.</string> + <key>LocalCacheVersion</key> + <string>Número da versão do cache.</string> + <key>LocalFileSystemBrowsingEnabled</key> + <string>Ativar/desativar o acesso ao sistema de arquivos local via seletor de arquivos.</string> + <key>LocalTerrainAsset1</key> + <string>Se definido como um UUID não nulo, substitui o asset de terreno localmente para todas as regiões com assets de material. Assets de terreno locais não são visíveis para os outros. Lembre-se de que esta configuração de depuração pode ser temporária. Não dependa de sua existência em builds futuros do viewer.</string> + <key>LocalTerrainAsset2</key> + <string>Se definido como um UUID não nulo, substitui o asset de terreno localmente para todas as regiões com assets de material. Assets de terreno locais não são visíveis para os outros. Lembre-se de que esta configuração de depuração pode ser temporária. Não dependa de sua existência em builds futuros do viewer.</string> + <key>LocalTerrainAsset3</key> + <string>Se definido como um UUID não nulo, substitui o asset de terreno localmente para todas as regiões com assets de material. Assets de terreno locais não são visíveis para os outros. Lembre-se de que esta configuração de depuração pode ser temporária. Não dependa de sua existência em builds futuros do viewer.</string> + <key>LocalTerrainAsset4</key> + <string>Se definido como um UUID não nulo, substitui o asset de terreno localmente para todas as regiões com assets de material. Assets de terreno locais não são visíveis para os outros. Lembre-se de que esta configuração de depuração pode ser temporária. Não dependa de sua existência em builds futuros do viewer.</string> + <key>LocalTerrainPaintEnabled</key> + <string>Ativa o paintmap local se LocalTerrainAsset1, etc. estiverem definidos.</string> + <key>LocalTerrainTransform1OffsetU</key> + <string>Deslocamento horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 1), quando LocalTerrainAsset1 estiver definido.</string> + <key>LocalTerrainTransform1OffsetV</key> + <string>Deslocamento vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 1), quando LocalTerrainAsset1 estiver definido.</string> + <key>LocalTerrainTransform1Rotation</key> + <string>Rotação (em graus) da transformação de textura glTF KHR_texture_transform do terreno local (camada 1), quando LocalTerrainAsset1 estiver definido.</string> + <key>LocalTerrainTransform1ScaleU</key> + <string>Escala horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 1), quando LocalTerrainAsset1 estiver definido.</string> + <key>LocalTerrainTransform1ScaleV</key> + <string>Escala vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 1), quando LocalTerrainAsset1 estiver definido.</string> + <key>LocalTerrainTransform2OffsetU</key> + <string>Deslocamento horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 2), quando LocalTerrainAsset2 estiver definido.</string> + <key>LocalTerrainTransform2OffsetV</key> + <string>Deslocamento vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 2), quando LocalTerrainAsset2 estiver definido.</string> + <key>LocalTerrainTransform2Rotation</key> + <string>Rotação (em graus) da transformação de textura glTF KHR_texture_transform do terreno local (camada 2), quando LocalTerrainAsset2 estiver definido.</string> + <key>LocalTerrainTransform2ScaleU</key> + <string>Escala horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 2), quando LocalTerrainAsset2 estiver definido.</string> + <key>LocalTerrainTransform2ScaleV</key> + <string>Escala vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 2), quando LocalTerrainAsset2 estiver definido.</string> + <key>LocalTerrainTransform3OffsetU</key> + <string>Deslocamento horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 3), quando LocalTerrainAsset3 estiver definido.</string> + <key>LocalTerrainTransform3OffsetV</key> + <string>Deslocamento vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 3), quando LocalTerrainAsset3 estiver definido.</string> + <key>LocalTerrainTransform3Rotation</key> + <string>Rotação (em graus) da transformação de textura glTF KHR_texture_transform do terreno local (camada 3), quando LocalTerrainAsset3 estiver definido.</string> + <key>LocalTerrainTransform3ScaleU</key> + <string>Escala horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 3), quando LocalTerrainAsset3 estiver definido.</string> + <key>LocalTerrainTransform3ScaleV</key> + <string>Escala vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 3), quando LocalTerrainAsset3 estiver definido.</string> + <key>LocalTerrainTransform4OffsetU</key> + <string>Deslocamento horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 4), quando LocalTerrainAsset4 estiver definido.</string> + <key>LocalTerrainTransform4OffsetV</key> + <string>Deslocamento vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 4), quando LocalTerrainAsset4 estiver definido.</string> + <key>LocalTerrainTransform4Rotation</key> + <string>Rotação (em graus) da transformação de textura glTF KHR_texture_transform do terreno local (camada 4), quando LocalTerrainAsset4 estiver definido.</string> + <key>LocalTerrainTransform4ScaleU</key> + <string>Escala horizontal (coordenada U) da transformação de textura glTF KHR_texture_transform do terreno local (camada 4), quando LocalTerrainAsset4 estiver definido.</string> + <key>LocalTerrainTransform4ScaleV</key> + <string>Escala vertical (coordenada V) da transformação de textura glTF KHR_texture_transform do terreno local (camada 4), quando LocalTerrainAsset4 estiver definido.</string> + <key>LogChat</key> + <string>Obsoleto - esta configuração não é mais usada e não tem efeito.</string> + <key>LogChatIM</key> + <string>Obsoleto - esta configuração não é mais usada e não tem efeito.</string> + <key>LogChatTimestamp</key> + <string>Obsoleto - esta configuração não é mais usada e não tem efeito.</string> + <key>LogFileNamewithDate</key> + <string>Adicionar data aos logs de chat e IM no formato chat-AAAA-MM-DD e 'nome do arquivo IM'-AAAA-MM. Para ver logs antigos, vá em ..\Second Life\[nome de login].</string> + <key>LogInventoryDecline</key> + <string>Registrar no chat do sistema sempre que uma oferta de inventário for recusada.</string> + <key>LogMessages</key> + <string>Registrar tráfego de rede.</string> + <key>LogMetrics</key> + <string>Registrar métricas do viewer.</string> + <key>LogNearbyChat</key> + <string>Registrar mensagens do Chat Próximo em arquivo. Usado no lugar de LogChat, com valor padrão "1".</string> + <key>LogPerformance</key> + <string>Registrar análise de desempenho para uma execução específica do viewer.</string> + <key>LogShowHistory</key> + <string>Exibir histórico no log.</string> + <key>LogTextureDownloadsToSimulator</key> + <string>Enviar um resumo de informações de textura ao sim.</string> + <key>LogTextureDownloadsToViewerLog</key> + <string>Enviar detalhes de download de textura ao log do viewer.</string> + <key>LogTextureNetworkTraffic</key> + <string>Registrar tráfego de rede de texturas.</string> + <key>LogTimestamp</key> + <string>Carimbo de data/hora no log.</string> + <key>LogTimestampDate</key> + <string>Incluir data no carimbo de data/hora.</string> + <key>LogWearableAssetSave</key> + <string>Salvar cópia dos wearables salvos no diretório de log.</string> + <key>LoginContentVersion</key> + <string>Versão do conteúdo web da página de login a exibir.</string> + <key>LoginLocation</key> + <string>Preferência de local de login padrão ('last', 'home').</string> + <key>LoginPage</key> + <string>Página de autenticação de login.</string> + <key>LoginSRVTimeout</key> + <string>Duração em segundos do timeout da requisição SRV de login.</string> + <key>LosslessJ2CUpload</key> + <string>Usar compressão sem perdas para uploads de imagens pequenas.</string> + <key>MFAHash</key> + <string>Substituir o hash de estado MFA para autenticação.</string> + <key>MainWorkTime</key> + <string>Tempo máximo por quadro dedicado à fila de trabalho do loop principal (em milissegundos).</string> + <key>MainloopTimeoutDefault</key> + <string>Duração do timeout para detecção de travamento do loop principal durante teletransportes, login e logout, em segundos.</string> + <key>MainloopTimeoutStarted</key> + <string>Duração do timeout para detecção de travamento do loop principal quando logado e sem teletransportar, em segundos.</string> + <key>MapScale</key> + <string>Nível de zoom do mapa-múndi (pixels por região).</string> + <key>MapServerURL</key> + <string>Modelo de URL do mapa-múndi para localizar os ladrilhos do mapa.</string> + <key>MapShowEvents</key> + <string>Mostrar eventos no mapa-múndi.</string> + <key>MapShowGridCoords</key> + <string>Mostra/oculta as coordenadas da grade de cada região no mapa-múndi.</string> + <key>MapShowInfohubs</key> + <string>Mostrar infohubs no mapa-múndi.</string> + <key>MapShowLandForSale</key> + <string>Mostrar terrenos à venda no mapa-múndi.</string> + <key>MapShowPeople</key> + <string>Mostrar outros usuários no mapa-múndi.</string> + <key>MapShowTelehubs</key> + <string>Mostrar telehubs no mapa-múndi.</string> + <key>Marker</key> + <string>[NÃO USADO]</string> + <key>MarketplaceListingsLogging</key> + <string>Ativar saída de depuração associada à API de Listagens do Marketplace (SLM).</string> + <key>MarketplaceListingsSortOrder</key> + <string>Especifica a classificação das listagens do marketplace.</string> + <key>MarketplaceURL</key> + <string>URL do Marketplace.</string> + <key>MarketplaceURL_bodypartFemale</key> + <string>URL do Marketplace de Partes do Corpo Femininas.</string> + <key>MarketplaceURL_bodypartMale</key> + <string>URL do Marketplace de Partes do Corpo Masculinas.</string> + <key>MarketplaceURL_clothingFemale</key> + <string>URL do Marketplace de Roupas Femininas.</string> + <key>MarketplaceURL_clothingMale</key> + <string>URL do Marketplace de Roupas Masculinas.</string> + <key>MarketplaceURL_eyesFemale</key> + <string>URL do Marketplace de Olhos Femininos.</string> + <key>MarketplaceURL_eyesMale</key> + <string>URL do Marketplace de Olhos Masculinos.</string> + <key>MarketplaceURL_glovesFemale</key> + <string>URL do Marketplace de Luvas Femininas.</string> + <key>MarketplaceURL_glovesMale</key> + <string>URL do Marketplace de Luvas Masculinas.</string> + <key>MarketplaceURL_hairFemale</key> + <string>URL do Marketplace de Cabelos Femininos.</string> + <key>MarketplaceURL_hairMale</key> + <string>URL do Marketplace de Cabelos Masculinos.</string> + <key>MarketplaceURL_jacketFemale</key> + <string>URL do Marketplace de Jaquetas Femininas.</string> + <key>MarketplaceURL_jacketMale</key> + <string>URL do Marketplace de Jaquetas Masculinas.</string> + <key>MarketplaceURL_objectFemale</key> + <string>URL do Marketplace de Anexos Femininos.</string> + <key>MarketplaceURL_objectMale</key> + <string>URL do Marketplace de Anexos Masculinos.</string> + <key>MarketplaceURL_pantsFemale</key> + <string>URL do Marketplace de Calças Femininas.</string> + <key>MarketplaceURL_pantsMale</key> + <string>URL do Marketplace de Calças Masculinas.</string> + <key>MarketplaceURL_shapeFemale</key> + <string>URL do Marketplace de Formas Femininas.</string> + <key>MarketplaceURL_shapeMale</key> + <string>URL do Marketplace de Formas Masculinas.</string> + <key>MarketplaceURL_shirtFemale</key> + <string>URL do Marketplace de Camisas Femininas.</string> + <key>MarketplaceURL_shirtMale</key> + <string>URL do Marketplace de Camisas Masculinas.</string> + <key>MarketplaceURL_shoesFemale</key> + <string>URL do Marketplace de Sapatos Femininos.</string> + <key>MarketplaceURL_shoesMale</key> + <string>URL do Marketplace de Sapatos Masculinos.</string> + <key>MarketplaceURL_skinFemale</key> + <string>URL do Marketplace de Peles Femininas.</string> + <key>MarketplaceURL_skinMale</key> + <string>URL do Marketplace de Peles Masculinas.</string> + <key>MarketplaceURL_skirtFemale</key> + <string>URL do Marketplace de Saias Femininas.</string> + <key>MarketplaceURL_skirtMale</key> + <string>URL do Marketplace de Saias Masculinas.</string> + <key>MarketplaceURL_socksFemale</key> + <string>URL do Marketplace de Meias Femininas.</string> + <key>MarketplaceURL_socksMale</key> + <string>URL do Marketplace de Meias Masculinas.</string> + <key>MarketplaceURL_tattooFemale</key> + <string>URL do Marketplace de Tatuagens Femininas.</string> + <key>MarketplaceURL_tattooMale</key> + <string>URL do Marketplace de Tatuagens Masculinas.</string> + <key>MarketplaceURL_underpantsFemale</key> + <string>URL do Marketplace de Roupas Íntimas Femininas.</string> + <key>MarketplaceURL_underpantsMale</key> + <string>URL do Marketplace de Roupas Íntimas Masculinas.</string> + <key>MarketplaceURL_undershirtFemale</key> + <string>URL do Marketplace de Camisetas Íntimas Femininas.</string> + <key>MarketplaceURL_undershirtMale</key> + <string>URL do Marketplace de Camisetas Íntimas Masculinas.</string> + <key>MaterialsEveryoneCopy</key> + <string>Todos podem copiar o material GLTF recém-criado.</string> + <key>MaterialsNextOwnerCopy</key> + <string>O material GLTF recém-criado pode ser copiado pelo próximo proprietário.</string> + <key>MaterialsNextOwnerModify</key> + <string>O material GLTF recém-criado pode ser modificado pelo próximo proprietário.</string> + <key>MaterialsNextOwnerTransfer</key> + <string>O material GLTF recém-criado pode ser revendido ou doado pelo próximo proprietário.</string> + <key>MaterialsShareWithGroup</key> + <string>Materiais GLTF recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>MaxAttachmentComplexity</key> + <string>Limite de peso de renderização do anexo.</string> + <key>MaxDragDistance</key> + <string>Distância máxima de translação permitida em uma única operação da ferramenta de mover (metros a partir do ponto inicial).</string> + <key>MaxFPS</key> + <string>Configuração OBSOLETA e NÃO UTILIZADA.</string> + <key>MaxHeapSize</key> + <string>Tamanho máximo do heap em builds de 32 bits (GB).</string> + <key>MaxHeapSize64</key> + <string>Tamanho máximo do heap em builds de 64 bits (GB).</string> + <key>MaxPersistentNotifications</key> + <string>Quantidade máxima de notificações persistentes.</string> + <key>MaxSelectDistance</key> + <string>Distância máxima de seleção permitida (metros a partir do avatar).</string> + <key>MaxWearableWaitTime</key> + <string>Máximo de segundos a aguardar a busca dos assets de wearables.</string> + <key>MePanelOpened</key> + <string>Indica que o painel Eu foi aberto pelo menos uma vez após a instalação do Viewer.</string> + <key>MediaAutoPlayHuds</key> + <string>Reproduzir automaticamente mídia de HUD.</string> + <key>MediaControlFadeTime</key> + <string>Tempo (em segundos) em que o controle de mídia desaparece.</string> + <key>MediaControlTimeout</key> + <string>Tempo (em segundos) para os controles de mídia desaparecerem sem atividade do mouse.</string> + <key>MediaEnablePopups</key> + <string>Se verdadeiro, ativa links direcionados e javascript na mídia para abrir novas janelas do navegador de mídia sem confirmação.</string> + <key>MediaFirstClickInteract</key> + <string>Esta configuração controla qual mídia (após carregada) não exige um primeiro clique para focar antes que a interação possa começar. Isso permite que cliques sejam passados diretamente à mídia, ignorando o requisito de clique de foco. É um campo de bits, com valores pré-calculados: Desativado=0; Apenas HUDs em uso=1; Objetos próprios=2; Objetos de amigos=4; Objetos de grupo=8; Objetos do dono do terreno=16; Qualquer objeto=32767; Todo MOAP=32768. Para detalhes completos, veja lltoolpie.h enum MediaFirstClickTypes.</string> + <key>MediaOnAPrimUI</key> + <string>Se deve ou não mostrar a interface de "compartilhamento de links".</string> + <key>MediaPerformanceManagerDebug</key> + <string>Se deve mostrar dados de depuração do gerenciador de desempenho de mídia na lista de mídia próxima.</string> + <key>MediaPluginDebugging</key> + <string>Ativar mensagens de depuração que podem ajudar a diagnosticar problemas de mídia (AVISO: pode reduzir o desempenho).</string> + <key>MediaRollOffMax</key> + <string>Distância na qual o volume da mídia é definido como 0.</string> + <key>MediaRollOffMin</key> + <string>Ajusta a distância na qual a atenuação da mídia começa.</string> + <key>MediaRollOffRate</key> + <string>Multiplicador para alterar a taxa de atenuação da mídia.</string> + <key>MediaShowOnOthers</key> + <string>Se deve ou não mostrar mídia em outros avatares.</string> + <key>MediaShowOutsideParcel</key> + <string>Se deve ou não mostrar mídia de fora da parcela atual.</string> + <key>MediaShowWithinParcel</key> + <string>Se deve ou não mostrar mídia dentro da parcela atual.</string> + <key>MediaSoundsEarLocation</key> + <string>Localização do ouvido virtual para mídia e sons.</string> + <key>MediaTentativeAutoPlay</key> + <string>Esta é uma flag tentativa que pode ser temporariamente desativada pelo usuário, até que ele se teletransporte.</string> + <key>MemoryLogFrequency</key> + <string>Segundos entre a exibição da memória no log (0 para nunca).</string> + <key>MemoryPrivatePoolEnabled</key> + <string>(Obsoleto) Ativar o gerenciamento de pool de memória privada.</string> + <key>MemoryPrivatePoolSize</key> + <string>(Obsoleto) Tamanho do pool de memória privada em MB (valor mínimo: 256).</string> + <key>MenuAccessKeyTime</key> + <string>Tempo (segundos) no qual a tecla de menu deve ser tocada para mover o foco para a barra de menu.</string> + <key>MenuSearch</key> + <string>Mostrar/ocultar o campo 'Buscar menus'.</string> + <key>Mesh2MaxConcurrentRequests</key> + <string>Número de conexões a usar para carregar malhas.</string> + <key>MeshBytesPerTriangle</key> + <string>Aproximação de bytes por triângulo a usar para determinar o custo de streaming de malha.</string> + <key>MeshEnabled</key> + <string>Expor a interface para a funcionalidade de malha (pode exigir reinício para ter efeito).</string> + <key>MeshImportUseSLM</key> + <string>Usar cópia em cache do último upload de um dae, se disponível, em vez de carregar o arquivo dae do zero.</string> + <key>MeshMaxConcurrentRequests</key> + <string>Número de conexões a usar para carregar malhas (sistema legado).</string> + <key>MeshMetaDataDiscount</key> + <string>Número de bytes a deduzir para metadados ao determinar o custo de streaming.</string> + <key>MeshMinimumByteSize</key> + <string>Número mínimo de bytes por bloco de LoD ao determinar o custo de streaming.</string> + <key>MeshTriangleBudget</key> + <string>Orçamento alvo de triângulos visíveis a usar ao estimar o custo de streaming.</string> + <key>MeshUploadFakeErrors</key> + <string>Forçar erros de upload (para testes).</string> + <key>MeshUploadLogXML</key> + <string>Log XML detalhado no upload de malha.</string> + <key>MeshUploadTimeOut</key> + <string>Tempo máximo em segundos para o llcurl executar uma requisição de upload de malha.</string> + <key>MeshUseGetMesh1</key> + <string>Se TRUE, usar a capacidade legada GetMesh para requisições de download de malha. Semidinâmico (lido nas travessias de região).</string> + <key>MeshUseHttpRetryAfter</key> + <string>Se TRUE, usar os cabeçalhos de resposta Retry-After ao reagendar uma requisição de malha que falha com status HTTP 503. Estático.</string> + <key>MigrateCacheDirectory</key> + <string>Verificar se há versão antiga do cache em disco para migrar para a localização atual.</string> + <key>MinObjectsForUnlinkConfirm</key> + <string>Quantidade mínima de objetos em um linkset para mostrar o diálogo de confirmação.</string> + <key>MinWindowHeight</key> + <string>Altura mínima da janela do viewer SL em pixels.</string> + <key>MinWindowWidth</key> + <string>Largura mínima da janela do viewer SL em pixels.</string> + <key>MiniMapAutoCenter</key> + <string>Centralizar o ponto focal do minimapa.</string> + <key>MiniMapPrimMaxRadius</key> + <string>Raio do maior prim a mostrar no minimapa. Aumentar além de 256 pode causar lag no cliente.</string> + <key>MiniMapRotate</key> + <string>Girar o mapa-múndi em miniatura na direção do avatar.</string> + <key>MiniMapScale</key> + <string>Nível de zoom do mapa-múndi em miniatura (pixels por região).</string> + <key>MiniMapShowPropertyLines</key> + <string>Se deve ou não mostrar os limites das parcelas no minimapa.</string> + <key>ModelUploadFolder</key> + <string>Todos os uploads de modelos serão armazenados neste diretório (UUID).</string> + <key>MouseMoon</key> + <string>Controlar a posição da lua com o mouse no modo mouselook (depuração do céu).</string> + <key>MouseSensitivity</key> + <string>Controla a responsividade do mouse no modo mouselook (fração ou múltiplo da sensibilidade padrão do mouse).</string> + <key>MouseSmooth</key> + <string>Suaviza o movimento do mouse no modo mouselook.</string> + <key>MouseSun</key> + <string>Controlar a posição do sol com o mouse no modo mouselook (depuração do céu).</string> + <key>MouseWarpMode</key> + <string>Controla o reposicionamento do mouse para o centro da tela durante o alt-zoom e o mouselook. Útil com certos dispositivos de entrada, programas de compartilhamento de mouse como Synergy ou ao rodar sob Parallels. 0 - automático, 1 - ligado, 2 - desligado.</string> + <key>MultiModeDoubleClickFolder</key> + <string>Define a ação do duplo clique em pasta na visão de múltiplas pastas (0 - expande e recolhe a pasta, 1 - abre uma nova janela, 2 - permanece no floater atual mas alterna para SFV).</string> + <key>MuteAmbient</key> + <string>Efeitos de som ambiente, como o ruído do vento, tocam em volume 0.</string> + <key>MuteAudio</key> + <string>Todo o áudio toca em volume 0 (o áudio em streaming ainda consome largura de banda, por exemplo).</string> + <key>MuteListLimit</key> + <string>Número máximo de entradas na lista de silenciados.</string> + <key>MuteMedia</key> + <string>A mídia toca em volume 0 (o áudio em streaming ainda consome largura de banda).</string> + <key>MuteMusic</key> + <string>A música toca em volume 0 (o áudio em streaming ainda consome largura de banda).</string> + <key>MuteSounds</key> + <string>Os efeitos sonoros tocam em volume 0.</string> + <key>MuteUI</key> + <string>Os efeitos sonoros da interface tocam em volume 0.</string> + <key>MuteVoice</key> + <string>A voz toca em volume 0 (o áudio em streaming ainda consome largura de banda).</string> + <key>MuteWhenMinimized</key> + <string>Silenciar o áudio quando a janela do SL está minimizada.</string> + <key>MyOutfitsAutofill</key> + <string>Sempre preencher automaticamente Minhas Roupas a partir da biblioteca quando vazias (caso contrário, acontece apenas uma vez).</string> + <key>NameTagDebugAVRezState</key> + <string>Mostrar o estado de carregamento do avatar na etiqueta de nome.</string> + <key>NameTagShowDisplayNames</key> + <string>Mostrar nomes de exibição nos rótulos de nome.</string> + <key>NameTagShowFriends</key> + <string>Destacar as etiquetas de nome dos seus amigos.</string> + <key>NameTagShowGroupTitles</key> + <string>Mostrar títulos de grupo nos rótulos de nome.</string> + <key>NameTagShowUsernames</key> + <string>Mostrar nomes de usuário nas etiquetas de nome dos avatares.</string> + <key>NametagOverWater</key> + <string>Renderizar a etiqueta de nome sobre a água transparente enquanto a câmera está acima da água.</string> + <key>NavBarShowCoordinates</key> + <string>Mostrar coordenadas na barra de navegação.</string> + <key>NavBarShowParcelProperties</key> + <string>Mostrar ícones de propriedade da parcela na barra de navegação.</string> + <key>NavigationBarRatio</key> + <string>Proporção entre a largura do painel de navegação e a largura total da pilha de navegação.</string> + <key>NearMeRange</key> + <string>Raio de busca para avatares próximos.</string> + <key>NearbyChatIsNotCollapsed</key> + <string>Salvar estado expandido/recolhido do chat próximo entre sessões.</string> + <key>NearbyChatIsNotTornOff</key> + <string>Salvar estado destacado do chat próximo entre sessões.</string> + <key>NearbyListHideUsernames</key> + <string>Mostrar tanto o nome de exibição quanto o nome de usuário na lista de pessoas próximas.</string> + <key>NearbyListShowIcons</key> + <string>Mostrar/ocultar ícones de pessoas na lista de pessoas próximas.</string> + <key>NearbyListShowMap</key> + <string>Mostrar/ocultar o mapa acima da lista de pessoas próximas.</string> + <key>NearbyPeopleSortOrder</key> + <string>Especifica a ordem de classificação de pessoas próximas (0 = por nome, 3 = por distância, 4 = mais recentes).</string> + <key>NearbyToastFadingTime</key> + <string>Número de segundos em que um toast de chat próximo desaparece.</string> + <key>NearbyToastLifeTime</key> + <string>Número de segundos em que um toast de chat próximo existe.</string> + <key>NewCacheLocation</key> + <string>Alterar a localização do cache em disco local para este.</string> + <key>NewCacheLocationTopFolder</key> + <string>Alterar a pasta raiz do cache em disco local para esta.</string> + <key>NewObjectCreationThrottle</key> + <string>Número máximo de novos objetos criados por quadro, -1 para desativar este limite.</string> + <key>NewObjectCreationThrottleDelayTime</key> + <string>Tempo em segundos para o NewObjectCreationThrottle entrar em vigor após a tela de progresso ser removida.</string> + <key>NextLoginLocation</key> + <string>Local para fazer login nesta sessão - definido pela linha de comando ou pelo painel de login, limpo após um login bem-sucedido.</string> + <key>NextOwnerCopy</key> + <string>(obsoleto) Objetos recém-criados podem ser copiados pelo próximo proprietário.</string> + <key>NextOwnerModify</key> + <string>(obsoleto) Objetos recém-criados podem ser modificados pelo próximo proprietário.</string> + <key>NextOwnerTransfer</key> + <string>(obsoleto) Objetos recém-criados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>NoAudio</key> + <string>Desativar reprodução de áudio.</string> + <key>NoHardwareProbe</key> + <string>Desativar a sondagem de hardware.</string> + <key>NoInventoryLibrary</key> + <string>(Obsoleto) Não solicitar a biblioteca de inventário.</string> + <key>NoPreload</key> + <string>Desativar o pré-carregamento de som e imagem.</string> + <key>NoQuickTime</key> + <string>Desativar o QuickTime para uma execução específica do viewer.</string> + <key>NoVerifySSLCert</key> + <string>Não verificar os pares SSL.</string> + <key>NonInteractive</key> + <string>Executar em um modo semi-headless em que apenas o login e o logout precisam funcionar.</string> + <key>NonvisibleObjectsInMemoryTime</key> + <string>Número de quadros que objetos não visíveis permanecem na memória antes de serem removidos. 0 significa máximo.</string> + <key>NotMovingHintTimeout</key> + <string>Número de segundos a aguardar o residente se mover antes de exibir a dica de movimento.</string> + <key>NotecardsEveryoneCopy</key> + <string>Todos podem copiar o notecard recém-criado.</string> + <key>NotecardsNextOwnerCopy</key> + <string>Notecards recém-criados podem ser copiados pelo próximo proprietário.</string> + <key>NotecardsNextOwnerModify</key> + <string>Notecards recém-criados podem ser modificados pelo próximo proprietário.</string> + <key>NotecardsNextOwnerTransfer</key> + <string>Notecards recém-criados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>NotecardsShareWithGroup</key> + <string>Notecards recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>NotificationChannelHeightRatio</key> + <string>Proporção entre o canal de notificação e a visão do mundo (0,0 - sempre mostrar 1 notificação, 1,0 - proporção máxima).</string> + <key>NotificationChannelRightMargin</key> + <string>Espaço entre os toasts e a borda direita da área onde eles podem aparecer.</string> + <key>NotificationConferenceIMOptions</key> + <string>Especifica como a interface responde a notificações de IM de conferência. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationFriendIMOptions</key> + <string>Especifica como a interface responde a notificações de IM de amigos. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationGroupChatOptions</key> + <string>Especifica como a interface responde a notificações de chat de grupo. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationNearbyChatOptions</key> + <string>Especifica como a interface responde a notificações de chat próximo. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationNonFriendIMOptions</key> + <string>Especifica como a interface responde a notificações de IM de não amigos. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationObjectIMOptions</key> + <string>Especifica como a interface responde a notificações de IM de objetos. Valores permitidos: [openconversations,toast,flash,noaction].</string> + <key>NotificationTipToastLifeTime</key> + <string>Número de segundos em que um toast de dica de notificação existe.</string> + <key>NotificationToastLifeTime</key> + <string>Número de segundos em que um toast de notificação existe.</string> + <key>NotifyMoneyChange</key> + <string>Exibir notificações pop-up para todas as transações de L$.</string> + <key>NotifyMoneyReceived</key> + <string>Exibir notificações pop-up ao receber L$.</string> + <key>NotifyMoneySpend</key> + <string>Exibir notificações pop-up ao gastar L$.</string> + <key>NotifyTipDuration</key> + <string>Tempo em que as dicas de notificação permanecem na tela (segundos).</string> + <key>NumSessions</key> + <string>Número de logins bem-sucedidos no Second Life.</string> + <key>NvAPICreateApplicationProfile</key> + <string>Criar perfil de aplicativo NVIDIA para configurações otimizadas.</string> + <key>OSHibernationMode</key> + <string>Se deve impedir que o SO hiberne. 0 - pode hibernar; 1 - não pode hibernar, pode desligar a tela; 2 - não pode hibernar, não pode desligar a tela.</string> + <key>ObjectCacheEnabled</key> + <string>Ativar o cache de objetos.</string> + <key>ObjectCostHighColor</key> + <string>Cor para objeto com alto custo de objeto.</string> + <key>ObjectCostHighThreshold</key> + <string>Limiar a partir do qual o custo do objeto é considerado alto (exibido em vermelho).</string> + <key>ObjectCostLowColor</key> + <string>Cor para objeto com baixo custo de objeto.</string> + <key>ObjectCostMidColor</key> + <string>Cor para objeto com custo de objeto médio.</string> + <key>ObjectInspectorTooltipDelay</key> + <string>Segundos antes de exibir a dica do inspetor de objetos.</string> + <key>ObjectsEveryoneCopy</key> + <string>Todos podem copiar o objeto recém-criado.</string> + <key>ObjectsNextOwnerCopy</key> + <string>Objetos recém-criados podem ser copiados pelo próximo proprietário.</string> + <key>ObjectsNextOwnerModify</key> + <string>Objetos recém-criados podem ser modificados pelo próximo proprietário.</string> + <key>ObjectsNextOwnerTransfer</key> + <string>Objetos recém-criados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>ObjectsShareWithGroup</key> + <string>Objetos recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>ObscureBalanceInStatusBar</key> + <string>Se verdadeiro, o saldo será mostrado como '*'.</string> + <key>OctreeAlphaDistanceFactor</key> + <string>Multiplicador na distância de objetos alpha para determinar o tamanho do nó da octree. Os dois primeiros parâmetros estão atualmente sem uso. O terceiro é a distância na qual realizar a ordenação detalhada de alpha.</string> + <key>OctreeAttachmentSizeFactor</key> + <string>Multiplicador no tamanho do anexo para determinar o tamanho do nó da octree.</string> + <key>OctreeDistanceFactor</key> + <string>Multiplicador na distância para determinar o tamanho do nó da octree.</string> + <key>OctreeMaxNodeCapacity</key> + <string>Número máximo de elementos a armazenar em um único nó da octree.</string> + <key>OctreeMinimumNodeSize</key> + <string>Tamanho mínimo de qualquer nó da octree.</string> + <key>OctreeStaticObjectSizeFactor</key> + <string>Multiplicador no tamanho de objetos estáticos para determinar o tamanho do nó da octree.</string> + <key>OpenDebugStatAdvanced</key> + <string>Expandir a exibição de estatísticas avançadas de desempenho.</string> + <key>OpenDebugStatBasic</key> + <string>Expandir a exibição de estatísticas básicas de desempenho.</string> + <key>OpenDebugStatMemory</key> + <string>Expandir a exibição de estatísticas de uso de memória.</string> + <key>OpenDebugStatNet</key> + <string>Expandir a exibição de estatísticas de desempenho de rede.</string> + <key>OpenDebugStatPathfinding</key> + <string>Expandir a exibição de estatísticas de desempenho de pathfinding.</string> + <key>OpenDebugStatPhysicsDetails</key> + <string>Expandir a exibição de estatísticas de detalhes de física.</string> + <key>OpenDebugStatRender</key> + <string>Expandir a exibição de estatísticas de desempenho de renderização.</string> + <key>OpenDebugStatSim</key> + <string>Expandir a exibição de estatísticas de desempenho do simulador.</string> + <key>OpenDebugStatSimTime</key> + <string>Expandir a exibição de estatísticas de tempo do simulador.</string> + <key>OpenDebugStatSimTimeDetails</key> + <string>Expandir a exibição de estatísticas de detalhes de tempo do simulador.</string> + <key>OpenDebugStatTexture</key> + <string>Expandir a exibição de estatísticas de desempenho de textura.</string> + <key>OpenDebugStatVoice</key> + <string>Expandir a exibição de estatísticas de voz (WebRTC).</string> + <key>OpenDebugStatVoiceIncoming</key> + <string>Expandir a exibição de estatísticas de áudio recebido (voz).</string> + <key>OpenDebugStatVoiceOutgoing</key> + <string>Expandir a exibição de estatísticas de áudio enviado (voz).</string> + <key>OpenIMOnVoice</key> + <string>Abrir a janela de IM correspondente ao conectar a uma chamada de voz.</string> + <key>OpenSidePanelsInFloaters</key> + <string>Se verdadeiro, sempre abrirá o conteúdo do painel lateral em um floater.</string> + <key>OutBandwidth</key> + <string>Limite de largura de banda de saída (bps).</string> + <key>OutfitGallerySortOrder</key> + <string>Classificação da galeria: 0 - ordenar roupas por nome, 1 - imagens primeiro, 2 - favoritos primeiro.</string> + <key>OutfitListFilterFullList</key> + <string>0 - mostrar apenas correspondências. 1 - mostrar todos os itens da roupa desde que a roupa ou um item dentro dela corresponda.</string> + <key>OutfitListSortOrder</key> + <string>Como a lista de roupas no floater do avatar é classificada. 0 - por nome, 1 - favoritos no topo.</string> + <key>OutfitOperationsTimeout</key> + <string>Timeout para operações relacionadas a roupas.</string> + <key>OverflowToastHeight</key> + <string>Altura de um toast de transbordamento.</string> + <key>OverlayTitle</key> + <string>Controla a mensagem de marca d'água exibida na tela quando "ShowOverlayTitle" está ativado (uma palavra, sublinhados viram espaços).</string> + <key>PBRUploadFolder</key> + <string>Todos os uploads PBR serão armazenados neste diretório (UUID).</string> + <key>PTTCurrentlyEnabled</key> + <string>Usar o modo Push to Talk.</string> + <key>PacketDropPercentage</key> + <string>Percentual de pacotes descartados pelo cliente.</string> + <key>ParcelMediaAutoPlayEnable</key> + <string>Reproduzir automaticamente a mídia da parcela quando disponível. 0 - Não reproduzir; 1 - Reproduzir; 2 - Perguntar.</string> + <key>ParticipantListShowIcons</key> + <string>Mostrar/ocultar ícones de pessoas na lista de participantes.</string> + <key>PathfindingAmbiance</key> + <string>Ambiência das exibições iluminadas da navmesh de pathfinding.</string> + <key>PathfindingBoundaryEdge</key> + <string>Cor de uma borda limítrofe (não atravessável) ao exibir a navmesh de pathfinding.</string> + <key>PathfindingConnectedEdge</key> + <string>Cor de uma borda conectada (atravessável) ao exibir a navmesh de pathfinding.</string> + <key>PathfindingExclusion</key> + <string>Cor dos volumes de exclusão ao exibir os tipos de objeto da navmesh de pathfinding.</string> + <key>PathfindingFaceColor</key> + <string>Cor das faces ao exibir a visão padrão da navmesh de pathfinding.</string> + <key>PathfindingHeatColorBase</key> + <string>Cor do valor menos caminhável ao exibir a navmesh de pathfinding como mapa de calor.</string> + <key>PathfindingHeatColorMax</key> + <string>Cor do valor mais caminhável ao exibir a navmesh de pathfinding como mapa de calor.</string> + <key>PathfindingLineOffset</key> + <string>Deslocamento de profundidade dos contornos de volume na exibição de pathfinding.</string> + <key>PathfindingLineWidth</key> + <string>Largura dos contornos de volume na exibição da navmesh de pathfinding.</string> + <key>PathfindingMaterial</key> + <string>Cor dos volumes de material ao exibir os tipos de objeto da navmesh de pathfinding.</string> + <key>PathfindingNavMeshClear</key> + <string>Cor de fundo ao exibir a navmesh de pathfinding.</string> + <key>PathfindingObstacle</key> + <string>Cor dos objetos de obstáculo estático ao exibir os tipos de objeto da navmesh de pathfinding.</string> + <key>PathfindingRetrieveNeighboringRegion</key> + <string>Baixar uma região vizinha ao visualizar uma navmesh de pathfinding (o valor padrão 99 significa não baixar vizinhos).</string> + <key>PathfindingTestPathColor</key> + <string>Cor do caminho de teste de pathfinding quando o caminho é válido.</string> + <key>PathfindingTestPathInvalidEndColor</key> + <string>Cor do ponto final da ferramenta de teste de pathfinding quando o caminho é inválido.</string> + <key>PathfindingTestPathValidEndColor</key> + <string>Cor do ponto final da ferramenta de teste de pathfinding quando o caminho é válido.</string> + <key>PathfindingWalkable</key> + <string>Cor dos objetos caminháveis ao exibir os tipos de objeto da navmesh de pathfinding.</string> + <key>PathfindingWaterColor</key> + <string>Cor do plano de água ao exibir a navmesh de pathfinding.</string> + <key>PathfindingXRayOpacity</key> + <string>Opacidade das linhas de raio-x na exibição de pathfinding.</string> + <key>PathfindingXRayTint</key> + <string>Quanto escurecer/clarear as linhas de raio-x na exibição de pathfinding.</string> + <key>PathfindingXRayWireframe</key> + <string>Renderizar o raio-x da navmesh de pathfinding como wireframe.</string> + <key>PerAccountSettingsFile</key> + <string>Nome do arquivo de configurações persistidas do cliente (por usuário).</string> + <key>PerfStatsCaptureEnabled</key> + <string>Ativar/desativar dados de tempo de renderização para dar suporte ao autotune.</string> + <key>PermissionsCautionEnabled</key> + <string>Quando ativado, altera o tratamento de requisições de permissão de script para ajudar a evitar a concessão acidental de certas permissões, como a de débito.</string> + <key>PermissionsCautionNotifyBoxHeight</key> + <string>Altura das mensagens de notificação do estilo de cautela.</string> + <key>PickerContextOpacity</key> + <string>Controla a opacidade geral do frustum de contexto que conecta os seletores de cor e textura às suas amostras.</string> + <key>PicksPerSecondMouseMoving</key> + <string>Com que frequência realizar seleções de hover enquanto o mouse se move (seleções por segundo).</string> + <key>PicksPerSecondMouseStationary</key> + <string>Com que frequência realizar seleções de hover enquanto o mouse está parado (seleções por segundo).</string> + <key>PieMenuLineWidth</key> + <string>Largura das linhas na exibição do menu de pizza (pixels).</string> + <key>PingInterpolate</key> + <string>Extrapolar a posição do objeto ao longo do vetor de velocidade com base no atraso de ping.</string> + <key>PitchFromMousePosition</key> + <string>Faixa vertical na qual a cabeça do avatar acompanha a posição do mouse (graus de rotação da cabeça do topo da janela até a base).</string> + <key>PlainTextChatHistory</key> + <string>Ativar/desativar o estilo de histórico de chat em texto simples.</string> + <key>PlayChatAnim</key> + <string>Seu avatar reproduz a animação de fala sempre que você fala, grita ou sussurra algo no chat próximo.</string> + <key>PlaySoundChatMention</key> + <string>Reproduz um som quando você é mencionado em um chat.</string> + <key>PlaySoundConferenceIM</key> + <string>Reproduz um som quando um IM de conferência é recebido.</string> + <key>PlaySoundFriendIM</key> + <string>Reproduz um som quando o IM de um amigo é recebido.</string> + <key>PlaySoundGroupChatIM</key> + <string>Reproduz um som quando um IM de chat de grupo é recebido.</string> + <key>PlaySoundIncomingVoiceCall</key> + <string>Reproduz um som ao receber uma chamada de voz.</string> + <key>PlaySoundInventoryOffer</key> + <string>Reproduz um som ao receber uma oferta de inventário.</string> + <key>PlaySoundNearbyChatIM</key> + <string>Reproduz um som quando um IM de chat próximo é recebido.</string> + <key>PlaySoundNewConversation</key> + <string>Reproduz um som ao ter uma nova conversa.</string> + <key>PlaySoundNonFriendIM</key> + <string>Reproduz um som quando o IM de um não amigo é recebido.</string> + <key>PlaySoundObjectIM</key> + <string>Reproduz um som quando um IM de um objeto é recebido.</string> + <key>PlaySoundTeleportOffer</key> + <string>Reproduz um som ao receber uma oferta de teletransporte.</string> + <key>PlayTypingAnim</key> + <string>Seu avatar reproduz a animação de digitação sempre que você digita na barra de chat.</string> + <key>PluginAttachDebuggerToPlugins</key> + <string>Se verdadeiro, anexar uma sessão de depurador a cada processo de plugin ao ser iniciado.</string> + <key>PluginInstancesCPULimit</key> + <string>Quantidade total de uso de CPU dos plugins antes que os plugins no mundo comecem a ser rebaixados para a prioridade "slideshow". Defina 0 para desativar esta verificação.</string> + <key>PluginInstancesLow</key> + <string>Limite do número de plugins de mídia no mundo que rodarão com prioridade "baixa".</string> + <key>PluginInstancesNormal</key> + <string>Limite do número de plugins de mídia no mundo que rodarão com prioridade "normal" ou superior.</string> + <key>PluginInstancesTotal</key> + <string>Limite rígido do número de plugins que serão instanciados ao mesmo tempo para mídia no mundo.</string> + <key>PluginUseReadThread</key> + <string>Usar uma thread separada para ler mensagens recebidas dos plugins.</string> + <key>PoolSizeAIS</key> + <string>Tamanho do pool de corrotinas para o AIS.</string> + <key>PoolSizeAssetStorage</key> + <string>Tamanho do pool de corrotinas para requisições de AssetStorage.</string> + <key>PoolSizeUpload</key> + <string>Tamanho do pool de corrotinas para upload.</string> + <key>PostFirstLoginIntroURL</key> + <string>URL da apresentação de introdução após o primeiro login de novos usuários.</string> + <key>PostFirstLoginIntroViewed</key> + <string>Flag que indica se o usuário viu a apresentação de introdução após o primeiro login de novos usuários.</string> + <key>PrecachingDelay</key> + <string>Atraso ao fazer login para carregar o mundo antes de exibi-lo (segundos).</string> + <key>PreferredBrowserBehavior</key> + <string>Usar o navegador do sistema para qualquer link (0), usar o navegador embutido para links do SL e o do sistema para os demais (1) ou usar apenas o navegador embutido (2).</string> + <key>PreferredMaturity</key> + <string>Configuração do nível de maturidade preferido pelo usuário (constantes em indra_constants.h).</string> + <key>PresetCameraActive</key> + <string>Nome da preferência selecionada no momento.</string> + <key>PresetGraphicActive</key> + <string>Nome da preferência selecionada no momento.</string> + <key>PreviewAmbientColor</key> + <string>Cor ambiente da renderização de pré-visualização.</string> + <key>PreviewDiffuse0</key> + <string>Cor difusa da luz de pré-visualização 0.</string> + <key>PreviewDiffuse1</key> + <string>Cor difusa da luz de pré-visualização 1.</string> + <key>PreviewDiffuse2</key> + <string>Cor difusa da luz de pré-visualização 2.</string> + <key>PreviewDirection0</key> + <string>Direção da luz 0 para a renderização de pré-visualização.</string> + <key>PreviewDirection1</key> + <string>Direção da luz 1 para a renderização de pré-visualização.</string> + <key>PreviewDirection2</key> + <string>Direção da luz 2 para a renderização de pré-visualização.</string> + <key>PreviewSpecular0</key> + <string>Cor especular da luz de pré-visualização 0.</string> + <key>PreviewSpecular1</key> + <string>Cor especular da luz de pré-visualização 1.</string> + <key>PreviewSpecular2</key> + <string>Cor especular da luz de pré-visualização 2.</string> + <key>PreviousInstallChecked</key> + <string>Se o viewer verificou a instalação anterior no mesmo canal para o NSIS.</string> + <key>PreviousScreenshotForReport</key> + <string>Usar captura de tela anterior para denúncia de abuso.</string> + <key>PrimMediaControlsUseHoverControlSet</key> + <string>Se passar o mouse sobre a mídia de um prim usa os controles mínimos de "hover" ou o conjunto de controles definido.</string> + <key>PrimMediaDragNDrop</key> + <string>Ativar arrastar e soltar de URLs sobre faces de prim.</string> + <key>PrimMediaMasterEnabled</key> + <string>Se a Mídia em um Prim está ou não ativada.</string> + <key>PrimMediaMaxRetries</key> + <string>Número máximo de tentativas para consultas de mídia.</string> + <key>PrimMediaMaxRoundRobinQueueSize</key> + <string>Número máximo de objetos para os quais o viewer atualizará a mídia continuamente.</string> + <key>PrimMediaMaxSortedQueueSize</key> + <string>Número máximo de objetos para os quais o viewer carregará mídia inicialmente.</string> + <key>PrimMediaRequestQueueDelay</key> + <string>Atraso do temporizador para buscar mídia da fila (em segundos).</string> + <key>PrimMediaRetryTimerDelay</key> + <string>Atraso do temporizador para repetir consultas de mídia (em segundos).</string> + <key>PrimTextMaxDrawDistance</key> + <string>Distância máxima de desenho além da qual PRIM_TEXT não será renderizado.</string> + <key>ProbeHardwareOnStartup</key> + <string>Consultar a configuração de hardware atual na inicialização do aplicativo.</string> + <key>PurgeCacheOnNextStartup</key> + <string>Limpar o cache de arquivos local na próxima vez que o viewer for executado.</string> + <key>PurgeCacheOnStartup</key> + <string>Limpar o cache de arquivos local toda vez que o viewer for executado.</string> + <key>PurgeDiskCacheOnStartup</key> + <string>Se deve ou não limpar o cache em disco por LRU durante a inicialização na thread principal.</string> + <key>PushToTalkButton</key> + <string>(Obsoleto) Qual botão ou tecla é usado para push-to-talk.</string> + <key>PushToTalkToggle</key> + <string>Se o botão da barra de ferramentas de push-to-talk deve se comportar como alternância.</string> + <key>QAMode</key> + <string>Ativar recursos de teste.</string> + <key>QAModeEventHostPort</key> + <string>(Obsoleto) Porta na qual o lleventhost deve escutar.</string> + <key>QAModeFakeSystemFolderIssues</key> + <string>Simula problemas de pastas de sistema no inventário.</string> + <key>QAModeMetrics</key> + <string>Ativa recursos de QA (logging, ciclagem mais rápida) para o coletor de métricas.</string> + <key>QAModeTermCode</key> + <string>Em LL_ERRS, encerrar com este código em vez da caixa de mensagem do SO.</string> + <key>QuickBuyCurrency</key> + <string>Alternar entre o floater de compra de moeda baseado em HTML e a versão XUI legada.</string> + <key>QuietSnapshotsToDisk</key> + <string>Tirar capturas para o disco sem reproduzir animação ou som.</string> + <key>QuitAfterSeconds</key> + <string>A duração permitida antes de encerrar.</string> + <key>QuitOnLoginActivated</key> + <string>Encerrar se a página de login for ativada (usado quando o login automático está ligado e os usuários não devem poder fazer login manualmente).</string> + <key>RadioLandBrushAction</key> + <string>Última operação de modificação de terreno selecionada (0 = nivelar, 1 = elevar, 2 = baixar, 3 = suavizar, 4 = irregular, 5 = reverter).</string> + <key>RecentItemsSortOrder</key> + <string>Especifica a chave de classificação dos itens de inventário recentes (+0 = nome, +1 = data, +2 = pastas sempre por nome, +4 = pastas de sistema no topo).</string> + <key>RecentJumpThresholdSecs</key> + <string>Segundos após a entrada de pulo durante os quais a animação de finalização do pouso é suprimida para evitar interromper pulos sucessivos rápidos.</string> + <key>RecentListShowIcons</key> + <string>Mostrar/ocultar ícones de pessoas na lista de recentes.</string> + <key>RecentPeopleSortOrder</key> + <string>Especifica a ordem de classificação de pessoas recentes (0 = por nome, 2 = mais recentes).</string> + <key>RectangleSelectInclusive</key> + <string>Selecionar objetos que tenham ao menos um vértice dentro do retângulo de seleção.</string> + <key>RegInClient</key> + <string>Experimental: incorporar o registro na tela de login.</string> + <key>RegionCheckTextureHeights</key> + <string>Não permitir que o usuário defina alturas baixas maiores que as altas.</string> + <key>RegionCrossingInterpolationTime</key> + <string>Por quanto tempo extrapolar o movimento do objeto após cruzar regiões.</string> + <key>RegionTextureSize</key> + <string>Dimensões da textura de terreno (potência de 2).</string> + <key>RememberPassword</key> + <string>Manter a senha (de forma criptografada) para o próximo login.</string> + <key>RememberUser</key> + <string>Manter o nome de usuário para o próximo login.</string> + <key>RenderAnimateRes</key> + <string>Animar o surgimento (rez) de prims.</string> + <key>RenderAnisotropic</key> + <string>Renderizar texturas usando filtragem anisotrópica.</string> + <key>RenderAppleUseMultGL</key> + <string>Se queremos usar OpenGL multithread em hardware Apple (requer reinício do SL).</string> + <key>RenderAttachedLights</key> + <string>Renderizar prims com luz que estão anexados a avatares.</string> + <key>RenderAttachedParticles</key> + <string>Renderizar sistemas de partículas que estão anexados a avatares.</string> + <key>RenderAutoHideSurfaceAreaLimit</key> + <string>Área de superfície máxima de um conjunto de objetos próximos no mundo antes de ocultar geometria automaticamente para evitar sobrecarga do sistema.</string> + <key>RenderAutoMaskAlphaDeferred</key> + <string>Usar máscaras alpha onde apropriado no Modelo de Iluminação Avançada.</string> + <key>RenderAutoMaskAlphaNonDeferred</key> + <string>Usar máscaras alpha onde apropriado quando não estiver usando o Modelo de Iluminação Avançada.</string> + <key>RenderAutoMuteLogging</key> + <string>Mostrar informações extras nos logs do viewer sobre custos de renderização de avatares.</string> + <key>RenderAutoMuteRenderWeightLimit</key> + <string>OBSOLETO. Esta configuração foi renomeada para RenderAvatarMaxNonImpostors.</string> + <key>RenderAutoMuteSurfaceAreaLimit</key> + <string>Área de superfície máxima dos anexos antes que um avatar seja renderizado como um impostor simples (para não usar este limite, defina como zero ou defina RenderAvatarMaxComplexity como zero).</string> + <key>RenderAvatarCloth</key> + <string>Controla se as roupas do avatar de sistema usam tecido ondulante.</string> + <key>RenderAvatarComplexityMode</key> + <string>0 - o limite de complexidade se aplica a todos, 1 - sempre mostrar amigos, 2 - mostrar apenas amigos.</string> + <key>RenderAvatarFriendsOnly</key> + <string>Quando ativado, oculta todos os avatares que não sejam amigos. Não afeta avatares de controle no mundo (animeshes), nem você mesmo.</string> + <key>RenderAvatarLODFactor</key> + <string>Controla o nível de detalhe dos avatares (multiplicador para a área de tela atual ao calcular o nível de detalhe).</string> + <key>RenderAvatarMaxART</key> + <string>Limite de tempo de renderização em microssegundos (0,0 = sem limite).</string> + <key>RenderAvatarMaxComplexity</key> + <string>Complexidade máxima de renderização do avatar.</string> + <key>RenderAvatarMaxNonImpostors</key> + <string>Número máximo de avatares a renderizar totalmente de uma vez; acima deste limite, usa renderização por impostor (renderização simplificada com atualizações menos frequentes), reduzindo o lag do cliente.</string> + <key>RenderAvatarMaxVisible</key> + <string>OBSOLETO e NÃO UTILIZADO. Veja RenderAvatarMaxNonImpostors.</string> + <key>RenderAvatarPhysicsLODFactor</key> + <string>Controla o nível de detalhe da física do avatar (como a física dos seios).</string> + <key>RenderBakeSunlight</key> + <string>Assar a luz do sol nos vertex buffers para objetos estáticos.</string> + <key>RenderBalanceInSnapshot</key> + <string>Exibir o saldo de L$ na captura.</string> + <key>RenderBufferVisualization</key> + <string>Envia um buffer selecionado para a tela. -1 = buffer de renderização final. 0 = Albedo, 1 = Especular/ORM, 2 = Normal, 3 = Emissivo, 4 = Luminância do olho, 5 = Luminância FXAA/Textura de borda SMAA, 6 = Pesos de mistura SMAA.</string> + <key>RenderBumpmapMinDistanceSquared</key> + <string>Distância máxima na qual renderizar primitivas com bumpmap (distância em metros, ao quadrado).</string> + <key>RenderCASSharpness</key> + <string>Nível de nitidez a aplicar via Contrast Adaptive Sharpening (0,0 (desligado) - 1,0).</string> + <key>RenderCPUBasis</key> + <string>Velocidade de clock de CPU de referência a usar para enviesar a classe da GPU (em MHz).</string> + <key>RenderCanUseGLTFPBROpaqueShaders</key> + <string>O hardware tem suporte para shaders de cena GLTF.</string> + <key>RenderCanUseTerrainBakeShaders</key> + <string>O hardware tem suporte para shaders de Terrain Bake.</string> + <key>RenderClass1MemoryBandwidth</key> + <string>Largura de banda de memória na qual usar Classe 1 por padrão, em gigabytes por segundo. Usado como base para classes superiores.</string> + <key>RenderComplexityColorMax</key> + <string>Configuração obsoleta não utilizada.</string> + <key>RenderComplexityColorMid</key> + <string>Configuração obsoleta não utilizada.</string> + <key>RenderComplexityColorMin</key> + <string>Configuração obsoleta não utilizada.</string> + <key>RenderComplexityStaticMax</key> + <string>Configuração obsoleta não utilizada.</string> + <key>RenderComplexityThreshold</key> + <string>Configuração obsoleta não utilizada.</string> + <key>RenderCompressTextures</key> + <string>Ativar compressão de texturas em implementações OpenGL 3.0 e posteriores (EXPERIMENTAL, requer reinício).</string> + <key>RenderCubeMap</key> + <string>Se podemos ou não renderizar o cube map.</string> + <key>RenderDebugAlphaMask</key> + <string>Testar os cortes de máscara alpha.</string> + <key>RenderDebugGLSession</key> + <string>Ativar depuração GL estrita no início da próxima sessão.</string> + <key>RenderDebugNormalScale</key> + <string>Escala das normais na exibição de depuração.</string> + <key>RenderDebugPipeline</key> + <string>Ativar depuração estrita do pipeline.</string> + <key>RenderDebugTextureBind</key> + <string>Ativar teste de desempenho de bind de textura.</string> + <key>RenderDefaultProbeUpdatePeriod</key> + <string>Quando RenderReflectionProbeLevel é 0, tempo em segundos a aguardar entre atualizações do mapa de reflexão.</string> + <key>RenderDeferred</key> + <string>Renderização diferida.</string> + <key>RenderDeferredAlphaSoften</key> + <string>Escalar para suavizar superfícies alpha (para partículas suaves).</string> + <key>RenderDeferredAtmospheric</key> + <string>Executar o shader atmosférico no renderizador diferido.</string> + <key>RenderDeferredBlurLight</key> + <string>Executar o shader de suavização de sombras no renderizador diferido.</string> + <key>RenderDeferredDisplayGamma</key> + <string>Expoente da rampa de gama para correção final antes do gama de exibição.</string> + <key>RenderDeferredNoise</key> + <string>Escalar de ruído para esconder banding na renderização diferida.</string> + <key>RenderDeferredSSAO</key> + <string>Executar o shader de oclusão de ambiente em espaço de tela no renderizador diferido.</string> + <key>RenderDeferredSpotShadowBias</key> + <string>Valor de viés para sombras de spot (previne shadow acne).</string> + <key>RenderDeferredSpotShadowOffset</key> + <string>Valor de deslocamento para sombras de spot (previne shadow acne).</string> + <key>RenderDeferredSun</key> + <string>Executar o shader de luz solar no renderizador diferido.</string> + <key>RenderDeferredSunWash</key> + <string>Quanto as luzes locais são apagadas pelo sol.</string> + <key>RenderDeferredTreeShadowBias</key> + <string>Valor de viés para sombras de árvores (previne shadow acne).</string> + <key>RenderDeferredTreeShadowOffset</key> + <string>Valor de deslocamento para sombras de árvores (previne shadow acne).</string> + <key>RenderDelayCreation</key> + <string>Limitar a criação de drawables.</string> + <key>RenderDelayVBUpdate</key> + <string>Atrasar as atualizações dos vertex buffers até pouco antes de renderizar.</string> + <key>RenderDepthOfField</key> + <string>Se deve usar o efeito de profundidade de campo quando o Modelo de Iluminação Avançada está ativado.</string> + <key>RenderDepthOfFieldInEditMode</key> + <string>Se deve usar o efeito de profundidade de campo no modo de edição.</string> + <key>RenderDepthPrePass</key> + <string>EXPERIMENTAL: preparar o buffer de profundidade com geometria de prim simples antes de renderizar com texturas.</string> + <key>RenderDesaturateIrradiance</key> + <string>Dessaturar a irradiância para remover o tom azulado.</string> + <key>RenderDiffuseLuminanceScale</key> + <string>Ajuste de luminância para superfícies difusas para auxiliar o comportamento de autoexposição.</string> + <key>RenderDisablePostProcessing</key> + <string>Desativar mapeamento de tons e correção de exposição quando o floater de construção está aberto (para artistas desenvolvendo materiais).</string> + <key>RenderDisableVintageMode</key> + <string>Ativa recursos adicionais do pipeline de renderização em máquinas mais novas, como HDR e texturas emissivas em conteúdo PBR.</string> + <key>RenderDownScaleMethod</key> + <string>Método a usar para reduzir imagens. 0 - FBO, 1 - PBO.</string> + <key>RenderDynamicExposureCoefficient</key> + <string>Coeficiente de luminância para exposição dinâmica.</string> + <key>RenderDynamicLOD</key> + <string>Ajustar dinamicamente o nível de detalhe.</string> + <key>RenderEdgeDepthCutoff</key> + <string>Corte para a diferença de profundidade que constitui uma borda.</string> + <key>RenderEdgeNormCutoff</key> + <string>Corte para a diferença de normal que constitui uma borda.</string> + <key>RenderEnableEmissiveBuffer</key> + <string>Ativar o buffer emissivo no gbuffer. Só deve ser desativado no modo GL3.</string> + <key>RenderExposure</key> + <string>Valor de exposição a enviar ao mapeador de tons.</string> + <key>RenderFSAASamples</key> + <string>Qualidade do antialiasing: 0 = Baixa, 1 = Média, 2 = Alta, 3 = Ultra.</string> + <key>RenderFSAAType</key> + <string>Tipo de antialiasing a usar: 0 = Nenhum, 1 = FXAA, 2 = SMAA.</string> + <key>RenderFarClip</key> + <string>Clipe de distância de renderização.</string> + <key>RenderFlexTimeFactor</key> + <string>Controla o nível de detalhe de objetos flexíveis (multiplicador para o tempo gasto processando objetos flex).</string> + <key>RenderFogRatio</key> + <string>OBSOLETO - Distância da câmera onde a névoa atinge densidade máxima (fração ou múltiplo da distância de far clip).</string> + <key>RenderGLContextCoreProfile</key> + <string>Não usar um contexto OpenGL de perfil de compatibilidade. Requer reinício.</string> + <key>RenderGLMultiThreadedMedia</key> + <string>Permitir que o OpenGL use múltiplos contextos de renderização para reproduzir mídia (pode reduzir engasgos de quadros, não funciona bem com drivers Intel).</string> + <key>RenderGLMultiThreadedTextures</key> + <string>Permitir que o OpenGL use múltiplos contextos de renderização para carregar texturas (pode reduzir engasgos de quadros, não funciona bem com drivers Intel).</string> + <key>RenderGamma</key> + <string>OBSOLETO - Define o expoente de gama para o renderizador.</string> + <key>RenderGammaFull</key> + <string>Usar correção de gama totalmente controlável, em vez da correção de gama mais rápida e fixa de 2.</string> + <key>RenderGlow</key> + <string>Renderizar o efeito de pós-processamento de bloom.</string> + <key>RenderGlowHDR</key> + <string>Ativar HDR para o mapa de brilho.</string> + <key>RenderGlowIterations</key> + <string>Número de vezes para iterar o brilho (mais alto = mais largo e suave, porém mais lento).</string> + <key>RenderGlowLumWeights</key> + <string>Pesos de cada canal de cor a usar no cálculo da luminância (devem somar 1,0).</string> + <key>RenderGlowMaxExtractAlpha</key> + <string>Valor máximo de alpha do brilho para extração de brilho no auto-glow.</string> + <key>RenderGlowMinLuminance</key> + <string>Intensidade mínima de luminância necessária para considerar um objeto brilhante o suficiente para brilhar automaticamente.</string> + <key>RenderGlowNoise</key> + <string>Ativa o ruído de brilho (dithering). Reduz o banding do brilho em certos casos.</string> + <key>RenderGlowResolutionPow</key> + <string>Resolução do mapa de brilho em potência de dois.</string> + <key>RenderGlowStrength</key> + <string>Força aditiva do brilho.</string> + <key>RenderGlowWarmthAmount</key> + <string>Quantidade de extração de calor a usar (em vez de extração de luminância). 0 = luminância, 1,0 = calor.</string> + <key>RenderGlowWarmthWeights</key> + <string>Peso de cada canal de cor usado antes de encontrar o calor máximo.</string> + <key>RenderGlowWidth</key> + <string>Tamanho da amostra de brilho (mais alto = mais largo e suave, mas eventualmente mais pixelado).</string> + <key>RenderHDREnabled</key> + <string>Ativar renderização HDR.</string> + <key>RenderHDRIExposure</key> + <string>Ajuste de exposição do HDRI ao pré-visualizar um HDRI. As unidades são EV. Valores razoáveis seriam de -10 a 10.</string> + <key>RenderHDRIIrradianceOnly</key> + <string>Usar o céu HDRI apenas para o mapa de irradiância quando RenderHDRISplitScreen é 0.</string> + <key>RenderHDRIRotation</key> + <string>Rotação (em graus) do ambiente ao pré-visualizar um HDRI.</string> + <key>RenderHDRISplitScreen</key> + <string>Qual percentual da tela renderizar usando HDRI vs. céu EEP.</string> + <key>RenderHDRSkySunlightScale</key> + <string>Fator de ajuste da escala de luz solar para combinar com o viewer pré-PBR quando o HDR está ativado.</string> + <key>RenderHUDInSnapshot</key> + <string>Exibir anexos de HUD na captura.</string> + <key>RenderHUDObjectsWarning</key> + <string>O viewer avisará o usuário sobre HUDs contendo objetos demais se a contagem de objetos estiver acima deste valor.</string> + <key>RenderHUDOversizedTexturesWarning</key> + <string>Quantas texturas de tamanho 1024 * 1024 ou maior um HUD pode conter antes de notificar o usuário.</string> + <key>RenderHUDParticles</key> + <string>Exibir sistemas de partículas em anexos de HUD (experimental).</string> + <key>RenderHUDTexturesMemoryWarning</key> + <string>O viewer avisará o usuário sobre texturas de HUD usando memória acima deste valor (em bytes).</string> + <key>RenderHUDTexturesWarning</key> + <string>O viewer avisará o usuário sobre HUDs contendo texturas demais se a contagem de texturas estiver acima deste valor.</string> + <key>RenderHeroProbeConservativeUpdateMultiplier</key> + <string>Quantas atualizações de probe aguardar até atualizar as faces que não estão diretamente voltadas para a câmera. Atua como multiplicador. Ex.: quadros na periferia da câmera atualizam a cada 3 atualizações, vs. os diretamente voltados para a câmera, que atualizam a cada atualização.</string> + <key>RenderHeroProbeDistance</key> + <string>Distância em metros até a qual os hero probes renderizam.</string> + <key>RenderHeroProbeResolution</key> + <string>Resolução para renderizar os hero probes usados em espelhos, água, etc.</string> + <key>RenderHeroProbeUpdateRate</key> + <string>Quantos quadros aguardar até renderizar o probe. Ex.: quadro sim, quadro não (1), a cada dois quadros (2), a cada três quadros (3) etc.</string> + <key>RenderHiDPI</key> + <string>Ativar suporte para telas HiDPI, como Retina (APENAS macOS, requer reinício).</string> + <key>RenderHiddenSelections</key> + <string>Mostrar linhas de seleção em objetos que estão atrás de outros objetos.</string> + <key>RenderHideGroupTitle</key> + <string>Não mostrar meu título de grupo no meu rótulo de nome.</string> + <key>RenderHighMemMinDiscardDecrement</key> + <string>Decremento mínimo do viés de descarte se houver excesso de memória de textura disponível.</string> + <key>RenderHighlightBrightness</key> + <string>Brilho dos destaques de mouseover.</string> + <key>RenderHighlightColor</key> + <string>Cor dos destaques de mouseover.</string> + <key>RenderHighlightFadeTime</key> + <string>Tempo de transição dos destaques de mouseover.</string> + <key>RenderHighlightSelections</key> + <string>Mostrar contornos de seleção nos objetos.</string> + <key>RenderHighlightThickness</key> + <string>Espessura dos destaques de mouseover.</string> + <key>RenderHoverGlowEnable</key> + <string>OBSOLETO --- Mostrar efeito de brilho ao passar o mouse sobre objetos interativos.</string> + <key>RenderInitError</key> + <string>Ocorreu um erro ao inicializar o GL.</string> + <key>RenderLightRadius</key> + <string>Renderizar o raio das luzes selecionadas.</string> + <key>RenderLocalLightCount</key> + <string>Número de luzes locais a renderizar.</string> + <key>RenderLowMemMinDiscardIncrement</key> + <string>Incremento mínimo do viés de descarte se a memória de textura disponível ficar baixa.</string> + <key>RenderMaxNodeSize</key> + <string>Tamanho máximo dos dados de vértice de um único nó (em KB).</string> + <key>RenderMaxOpenGLVersion</key> + <string>Versão máxima do OpenGL a tentar usar (mínimo 3.1, máximo 4.6). Requer reinício. Apenas Windows.</string> + <key>RenderMaxPartCount</key> + <string>Número máximo de partículas a exibir na tela.</string> + <key>RenderMaxTextureIndex</key> + <string>Índice máximo de textura a usar para renderização de textura indexada.</string> + <key>RenderMaxTextureResolution</key> + <string>Resolução máxima de textura a baixar para texturas não impulsionadas.</string> + <key>RenderMaxVBOSize</key> + <string>Tamanho máximo de um vertex buffer (em KB).</string> + <key>RenderMaxVRAMBudget</key> + <string>Quantidade máxima de memória de textura a reservar (em MB), ou 0 para detecção automática.</string> + <key>RenderMinFreeMainMemoryThreshold</key> + <string>Se a memória física livre disponível estiver abaixo deste valor, as texturas são reduzidas agressivamente.</string> + <key>RenderMinimumLODTriangleCount</key> + <string>Limiar de contagem de triângulos no qual a geração automática de LOD para.</string> + <key>RenderMirrors</key> + <string>Renderiza espelhos em tempo real.</string> + <key>RenderNameFadeDuration</key> + <string>Intervalo de tempo durante o qual os nomes dos avatares desaparecem (segundos).</string> + <key>RenderNameShowSelf</key> + <string>Exibir o próprio nome acima do avatar.</string> + <key>RenderNameShowTime</key> + <string>Desaparecer os nomes dos avatares após o tempo especificado (segundos).</string> + <key>RenderNoAlpha</key> + <string>Desativar a renderização de objetos alpha (renderizar todos os objetos alpha como máscaras alpha).</string> + <key>RenderNormalMapScale</key> + <string>Escalar aplicado ao mapa de altura ao gerar mapas de normais.</string> + <key>RenderNsightDebugSupport</key> + <string>Desativar recursos que impedem o uso do nVidia nSight com o SL. Requer reinício.</string> + <key>RenderObjectBump</key> + <string>OBSOLETO (apenas TRUE é suportado) Mostrar bumpmapping em primitivas.</string> + <key>RenderOcclusionTimeout</key> + <string>Número máximo de quadros a aguardar em uma consulta de oclusão antes de lê-la de volta à força.</string> + <key>RenderParcelSelection</key> + <string>Exibir o contorno da parcela selecionada.</string> + <key>RenderPerformanceTest</key> + <string>Desativar a renderização de tudo, exceto o conteúdo no mundo, para testes de desempenho.</string> + <key>RenderPreferStreamDraw</key> + <string>Usar GL_STREAM_DRAW no lugar de GL_DYNAMIC_DRAW.</string> + <key>RenderQualityPerformance</key> + <string>Quais configurações gráficas você escolheu. Não use esta configuração para alterar a qualidade diretamente pelas configurações de depuração.</string> + <key>RenderReflectionDetail</key> + <string>OBSOLETO -- use RenderTransparentWater e RenderReflectionProbeDetail -- Detalhe do passe de renderização de reflexão.</string> + <key>RenderReflectionProbeAmbiance</key> + <string>Quanto os probes de reflexão contribuem para a luz ambiente.</string> + <key>RenderReflectionProbeCount</key> + <string>Número de probes a renderizar. Máximo de 256. Ajusta para a potência de 2 mais próxima.</string> + <key>RenderReflectionProbeDetail</key> + <string>Detalhe das reflexões. (-1 - Desativado, 0 - Apenas estático, 1 - Estático + Dinâmico, 2 - Tempo real).</string> + <key>RenderReflectionProbeDrawDistance</key> + <string>Far clip da câmera a usar ao atualizar os probes de reflexão.</string> + <key>RenderReflectionProbeDynamicAllocation</key> + <string>Ativar alocação dinâmica de probes de reflexão. -1 significa sem alocação dinâmica. Define um buffer a alocar quando ocorre uma alocação dinâmica.</string> + <key>RenderReflectionProbeLevel</key> + <string>Controle dos probes de reflexão. 0 - desativar (um probe para todos), 1 - apenas probes manuais, 2 - manual + terreno/água, 3 - Manual + Terreno/água + objetos.</string> + <key>RenderReflectionProbeMaxLocalLightAmbiance</key> + <string>Ambiência efetiva máxima de probe para luzes locais.</string> + <key>RenderReflectionProbeResolution</key> + <string>Resolução dos mapas de radiância dos probes de reflexão (requer reinício). Será definida para a próxima potência de dois mais alta, limitada a [64, 512]. Note que alterar este valor pode consumir uma quantidade enorme de memória de vídeo.</string> + <key>RenderReflectionProbeShowTransparent</key> + <string>Mostrar probes de reflexão na visão de depuração de transparência.</string> + <key>RenderReflectionProbeVolumes</key> + <string>Renderizar os volumes de influência dos probes de reflexão.</string> + <key>RenderReflectionRes</key> + <string>Resolução do mapa de reflexão.</string> + <key>RenderReflectionsEnabled</key> + <string>Ativar/desativar probes de reflexão.</string> + <key>RenderReservedTextureIndices</key> + <string>Quantidade de índices de textura a reservar para mapas de sombra e reflexão ao usar renderização de textura indexada. Provavelmente só deve ser definido na tela de login.</string> + <key>RenderResolutionDivisor</key> + <string>Divisor para renderizar a cena 3D em resolução reduzida.</string> + <key>RenderSSAOEffect</key> + <string>Multiplicador para (1) valor e (2) saturação (definição HSV), para áreas totalmente ocluídas. Mistura com a cor original para áreas parcialmente ocluídas. (O terceiro componente não é utilizado).</string> + <key>RenderSSAOFactor</key> + <string>Fator de sensibilidade de oclusão para a oclusão de ambiente (maior é mais).</string> + <key>RenderSSAOIrradianceMax</key> + <string>Fator máximo para a entrada de irradiância no SSAO.</string> + <key>RenderSSAOIrradianceScale</key> + <string>Fator de escala para a entrada de irradiância no SSAO.</string> + <key>RenderSSAOMaxScale</key> + <string>Raio máximo de tela para amostragem (pixels).</string> + <key>RenderSSAOScale</key> + <string>Fator de escala para a área a amostrar em busca de oclusores (pixels a 1 metro de distância, variando inversamente com a distância).</string> + <key>RenderScreenSpaceReflectionAdaptiveStepMultiplier</key> + <string>Multiplicador para escalar o passo adaptativo.</string> + <key>RenderScreenSpaceReflectionDepthRejectBias</key> + <string>Viés contra o buffer de profundidade antes de rejeitar uma amostra.</string> + <key>RenderScreenSpaceReflectionDistanceBias</key> + <string>Viés de distância a aplicar ao rejeitar uma amostra potencial.</string> + <key>RenderScreenSpaceReflectionGlossySamples</key> + <string>Número máximo de amostras a aplicar para SSR brilhante.</string> + <key>RenderScreenSpaceReflectionIterations</key> + <string>Número de vezes que o algoritmo de ray march executa para encontrar um possível acerto.</string> + <key>RenderScreenSpaceReflectionRayStep</key> + <string>Quão grande é o passo entre cada execução.</string> + <key>RenderScreenSpaceReflections</key> + <string>Renderiza reflexões em espaço de tela para considerar melhor objetos dinâmicos com probes de reflexão.</string> + <key>RenderShaderCacheEnabled</key> + <string>Ativar cache de shaders binários.</string> + <key>RenderShaderCacheVersion</key> + <string>Hash de versão atual do cache de shaders.</string> + <key>RenderShaderLODThreshold</key> + <string>Fração da distância de desenho que define a troca para um LOD de shader diferente.</string> + <key>RenderShaderLightingMaxLevel</key> + <string>Nível máximo de iluminação a usar no shader (classe 3 é o padrão, 2 é menos luzes, 1 é apenas sol/lua. Contorna bugs do compilador de shaders em certas plataformas).</string> + <key>RenderShaderParticleThreshold</key> + <string>Fração da distância de desenho a partir da qual não usar shader em partículas.</string> + <key>RenderShadowBias</key> + <string>Valor de viés para sombras (previne shadow acne).</string> + <key>RenderShadowBiasError</key> + <string>Escala de erro para o viés de sombra (com base na altitude).</string> + <key>RenderShadowBlurDistFactor</key> + <string>Escalar de distância para o desfoque de sombra.</string> + <key>RenderShadowBlurSamples</key> + <string>Número de amostras a tomar em cada passe de desfoque de sombra (faixa de 1-16). O número real de amostras é valor * 2 - 1.</string> + <key>RenderShadowBlurSize</key> + <string>Escala do kernel de suavização de sombra.</string> + <key>RenderShadowDetail</key> + <string>Detalhe das sombras.</string> + <key>RenderShadowErrorCutoff</key> + <string>Valor de erro de corte para usar projeção ortográfica em vez de perspectiva.</string> + <key>RenderShadowFOVCutoff</key> + <string>FOV de corte para usar projeção ortográfica em vez de perspectiva.</string> + <key>RenderShadowGaussian</key> + <string>Coeficientes gaussianos para os dois passes de desfoque de sombra/SSAO (componente z não utilizado).</string> + <key>RenderShadowNoise</key> + <string>Magnitude do ruído nas amostras de sombra.</string> + <key>RenderShadowOffset</key> + <string>Valor de deslocamento para sombras (previne shadow acne).</string> + <key>RenderShadowOffsetError</key> + <string>Escala de erro para o deslocamento de sombra (com base na altitude).</string> + <key>RenderShadowProjExponent</key> + <string>Expoente aplicado à transição entre projeções de sombra ortográfica e em perspectiva com base no ângulo de visão e no vetor de luz.</string> + <key>RenderShadowProjOffset</key> + <string>Quanto escalar a distância até a origem virtual da projeção em perspectiva da sombra.</string> + <key>RenderShadowResolutionScale</key> + <string>Escala da resolução do mapa de sombra vs. resolução da tela (apenas valores positivos são permitidos).</string> + <key>RenderShadowSlopeThreshold</key> + <string>Valor de inclinação de corte para pontos que afetam a geração de sombra em perspectiva.</string> + <key>RenderShadowSplitExponent</key> + <string>Distâncias de divisão do plano de near clip para os frusta do mapa de sombra (x=perspectiva, y=ortográfica, z=taxa de transição).</string> + <key>RenderShadowSplits</key> + <string>Quantidade de divisões do mapa de sombra a renderizar (0 - 3).</string> + <key>RenderSkyAmbientScale</key> + <string>Fator de ajuste da escala de ambiente para combinar com o viewer pré-PBR.</string> + <key>RenderSkyAutoAdjustAmbientScale</key> + <string>Quanto escalar o ambiente ao autoajustar céus legados.</string> + <key>RenderSkyAutoAdjustBlueDensityScale</key> + <string>Valor de escala do Blue Horizon a usar ao autoajustar céus legados.</string> + <key>RenderSkyAutoAdjustBlueHorizonScale</key> + <string>Valor de escala do Blue Horizon a usar ao autoajustar céus legados.</string> + <key>RenderSkyAutoAdjustHDRScale</key> + <string>Valor de escala HDR a usar ao autoajustar céus legados.</string> + <key>RenderSkyAutoAdjustLegacy</key> + <string>Se verdadeiro, autoajustar céus legados (aqueles sem valor de ambiência de probe) para aproveitar os probes e o HDR. Este é o botão de "opt-out" para HDR e mapeamento de tons quando combinado com uma configuração de céu anterior ao PBR.</string> + <key>RenderSkyAutoAdjustProbeAmbiance</key> + <string>Valor de ambiência de probe ao autoajustar céus legados.</string> + <key>RenderSkyAutoAdjustSunColorScale</key> + <string>Escalar da cor do sol ao autoajustar céus legados.</string> + <key>RenderSkySunlightScale</key> + <string>Fator de ajuste da escala de luz solar para combinar com o viewer pré-PBR quando o HDR está desativado.</string> + <key>RenderSnapshotNoPost</key> + <string>Desativar mapeamento de tons e correção de exposição quando a captura está sendo renderizada.</string> + <key>RenderSpecularExponent</key> + <string>Expoente especular para gerar o mapa especular.</string> + <key>RenderSpecularPrecision</key> + <string>Forçar LUT de ponto flutuante de 32 bits.</string> + <key>RenderSpecularResX</key> + <string>Resolução do mapa especular.</string> + <key>RenderSpecularResY</key> + <string>Resolução do mapa especular.</string> + <key>RenderSpotLightsInNondeferred</key> + <string>Se deve suportar projetores como spotlights quando o Modelo de Iluminação Avançada está desativado.</string> + <key>RenderSpotShadowBias</key> + <string>Valor de viés para sombras (previne shadow acne).</string> + <key>RenderSpotShadowOffset</key> + <string>Valor de deslocamento para sombras (previne shadow acne).</string> + <key>RenderSunDynamicRange</key> + <string>Define quanto por cento o sol é mais brilhante que as luzes pontuais locais (1,0 = 100% mais brilhante. O valor não deve ser menor que 0).</string> + <key>RenderTerrainDetail</key> + <string>Detalhe aplicado à texturização do terreno (0 = nenhum, 1 = completo).</string> + <key>RenderTerrainLODFactor</key> + <string>Controla o nível de detalhe do terreno (multiplicador para a área de tela atual ao calcular o nível de detalhe).</string> + <key>RenderTerrainPBRDetail</key> + <string>Nível de detalhe para terreno PBR. 0 é o detalhe completo. Valores negativos removem recursos de renderização, de acordo com a especificação GLTF quando possível, o que reduz o número de binds de textura.</string> + <key>RenderTerrainPBREnabled</key> + <string>Ativar recursos de terreno PBR.</string> + <key>RenderTerrainPBRNormalsEnabled</key> + <string>EXPERIMENTAL: alterar a geração de normais para terreno PBR.</string> + <key>RenderTerrainPBRPlanarSampleCount</key> + <string>De quantos planos UV amostrar as texturas do terreno PBR. 1 é "plano", 3 é mapeamento triplanar (também conhecido como box mapping).</string> + <key>RenderTerrainPBRScale</key> + <string>Escala da textura de detalhe do terreno PBR (metros).</string> + <key>RenderTerrainPBRTransformsEnabled</key> + <string>EXPERIMENTAL: ativar transformações de textura do terreno PBR.</string> + <key>RenderTerrainPBRTriplanarBlendFactor</key> + <string>Valores mais altos criam transições mais nítidas, mas têm maior probabilidade de produzir artefatos.</string> + <key>RenderTerrainScale</key> + <string>Escala da textura de detalhe do terreno (metros).</string> + <key>RenderTextureVRAMDivisor</key> + <string>Divisor para a quantidade máxima de VRAM que o viewer usará para texturas. 1 = toda a VRAM. Usado em conjunto com RenderMaxVRAMBudget.</string> + <key>RenderTonemapMix</key> + <string>Mistura entre cores lineares e mapeadas por tom (0,0 (Linear) - 1,0 (Mapeado por tom)).</string> + <key>RenderTonemapType</key> + <string>Qual mapeador de tons usar: 0 = Khronos Neutral, 1 = ACES.</string> + <key>RenderTrackerBeacon</key> + <string>Exibir seta de rastreamento e marcador para o avatar alvo, destino de teletransporte.</string> + <key>RenderTransparentWater</key> + <string>Renderizar a água como transparente. Definir como falso renderiza a água como opaca com uma textura simples aplicada.</string> + <key>RenderTreeLODFactor</key> + <string>Controla o nível de detalhe da vegetação (multiplicador para a área de tela atual ao calcular o nível de detalhe).</string> + <key>RenderUIBuffer</key> + <string>Armazenar em cache a renderização da interface em um buffer alinhado à tela.</string> + <key>RenderUIInSnapshot</key> + <string>Exibir a interface do usuário na captura.</string> + <key>RenderUnloadedAvatar</key> + <string>Mostrar avatares que ainda não terminaram de carregar.</string> + <key>RenderUseAdvancedAtmospherics</key> + <string>Usar atmosféricos pré-computados sofisticados e afins.</string> + <key>RenderUseExposureSkySettings</key> + <string>Usar as configurações de exposição do céu em vez de derivar da escala HDR.</string> + <key>RenderUseFarClip</key> + <string>Se falso, o culling de frustum ignorará o plano de far clip.</string> + <key>RenderUseStreamVBO</key> + <string>Usar VBOs para buffers de stream.</string> + <key>RenderUseTriStrips</key> + <string>OBSOLETO - agora sempre assumido como falso - Usar tiras de triângulos para renderizar prims.</string> + <key>RenderUseVAO</key> + <string>[EXPERIMENTAL] Usar GL Vertex Array Objects.</string> + <key>RenderVBOEnable</key> + <string>Usar GL Vertex Buffer Objects.</string> + <key>RenderVBOMappingDisable</key> + <string>Desativar VBO glMapBufferARB.</string> + <key>RenderVSyncEnable</key> + <string>Atualizar quadros entre as varreduras de exibição (FALSE = atualizar quadros o mais rápido possível).</string> + <key>RenderVolumeLODFactor</key> + <string>Controla o nível de detalhe das primitivas (multiplicador para a área de tela atual ao calcular o nível de detalhe).</string> + <key>RenderWater</key> + <string>Renderizar água.</string> + <key>RenderWaterMaterials</key> + <string>As reflexões planares da água incluem a renderização de materiais.</string> + <key>RenderWaterMipNormal</key> + <string>Usar mip maps para o mapa de normais da água.</string> + <key>RenderWaterRefResolution</key> + <string>Resolução da reflexão planar da água.</string> + <key>ReplaySession</key> + <string>Solicitar a reprodução de um arquivo de piloto gravado anteriormente.</string> + <key>ReportBugURL</key> + <string>URL usada para registrar bugs a partir do viewer.</string> + <key>RequestFullRegionCache</key> + <string>Se definido, pedir ao sim para enviar o cache completo de objetos da região. Precisa reiniciar o viewer.</string> + <key>ResetUIScaleOnFirstRun</key> + <string>Redefine o fator de escala da interface na primeira execução devido à mudança no comportamento de escala da tela.</string> + <key>RestoreCameraPosOnLogin</key> + <string>Redefinir a posição da câmera para a localização no logout.</string> + <key>RevokePermsOnStopAnimation</key> + <string>Limpar as permissões de animação ao escolher "Parar de me animar".</string> + <key>RotateRight</key> + <string>Faz o agente girar para a direita.</string> + <key>RotationStep</key> + <string>Todas as rotações pela ferramenta de rotação são restritas a múltiplos desta unidade (graus).</string> + <key>RunMultipleThreads</key> + <string>Se TRUE, manter as threads de segundo plano ativas durante a renderização.</string> + <key>SLURLDragNDrop</key> + <string>Ativar arrastar e soltar de SLURLs no viewer.</string> + <key>SLURLPassToOtherInstance</key> + <string>Passar a execução para instâncias anteriores do viewer se houver uma slurl fornecida.</string> + <key>SLURLTeleportDirectly</key> + <string>Clicar em uma slurl teletransporta você diretamente em vez de abrir o painel de lugares.</string> + <key>SafeMode</key> + <string>Redefinir preferências, executar em modo de segurança.</string> + <key>SaveMinidump</key> + <string>Salvar minidump para depuração do desenvolvedor em caso de crash.</string> + <key>ScaleShowAxes</key> + <string>Mostrar o indicador do eixo de escala selecionado ao escalonar.</string> + <key>ScaleStretchTextures</key> + <string>Esticar as texturas junto com o objeto ao escalonar.</string> + <key>ScaleUniform</key> + <string>Escalonar os objetos selecionados uniformemente em torno do centro da seleção.</string> + <key>SceneLoadFrontPixelThreshold</key> + <string>em pixels, todos os objetos no frustum de visão cuja área de tela seja maior que este limiar serão carregados.</string> + <key>SceneLoadHighMemoryBound</key> + <string>em MB, quando o uso total de memória estiver acima deste limiar, um mínimo de objetos invisíveis é mantido na memória.</string> + <key>SceneLoadLowMemoryBound</key> + <string>em MB, quando o uso total de memória estiver acima deste limiar, começar a reduzir os objetos invisíveis mantidos na memória.</string> + <key>SceneLoadMinRadius</key> + <string>em metros, todos os objetos (visíveis ou invisíveis) dentro deste raio permanecerão carregados na memória.</string> + <key>SceneLoadRearMaxRadiusFraction</key> + <string>uma fração da distância de desenho além da qual todos os objetos fora do frustum de visão serão descarregados, independentemente do limiar de pixels.</string> + <key>SceneLoadRearPixelThreshold</key> + <string>em pixels, todos os objetos fora do frustum de visão cuja área de tela seja maior que este limiar permanecerão carregados.</string> + <key>SceneLoadingMonitorEnabled</key> + <string>Ativar o monitor de carregamento de cena se definido.</string> + <key>SceneLoadingMonitorPixelDiffThreshold</key> + <string>Quantidade de pixels alterados necessária para considerar a cena ainda em carregamento (raiz quadrada da fração de pixels na tela).</string> + <key>SceneLoadingMonitorSampleTime</key> + <string>Tempo entre amostras de tela ao monitorar o carregamento da cena (segundos).</string> + <key>ScriptDialogLimitations</key> + <string>Limita a quantidade de diálogos por script (0 - por objeto, 1 - por canal, 2 - por canal para anexos, 3 - por canal para HUDs, 4 - sem restrição para HUDs).</string> + <key>ScriptHelpFollowsCursor</key> + <string>A janela de ajuda de scripts atualiza o conteúdo com base no texto sob o cursor no editor de scripts.</string> + <key>ScriptToastButtonWidth</key> + <string>Largura padrão dos botões no toast de diálogo de script.</string> + <key>ScriptsCanShowUI</key> + <string>Permitir que chamadas LSL (como LLMapDestination) abram a interface do viewer.</string> + <key>ScriptsEveryoneCopy</key> + <string>Todos podem copiar o script recém-criado.</string> + <key>ScriptsNextOwnerCopy</key> + <string>Scripts recém-criados podem ser copiados pelo próximo proprietário.</string> + <key>ScriptsNextOwnerModify</key> + <string>Scripts recém-criados podem ser modificados pelo próximo proprietário.</string> + <key>ScriptsNextOwnerTransfer</key> + <string>Scripts recém-criados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>ScriptsShareWithGroup</key> + <string>Scripts recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>SearchFromAddressBar</key> + <string>Permite inserir consultas de busca na barra de endereço de navegação.</string> + <key>SearchURL</key> + <string>URL do site de busca, exibida no floater Buscar.</string> + <key>SelectInvisibleObjects</key> + <string>Selecionar objetos invisíveis.</string> + <key>SelectMovableOnly</key> + <string>Selecionar apenas objetos que você pode mover.</string> + <key>SelectOwnedOnly</key> + <string>Selecionar apenas objetos que você possui.</string> + <key>SelectReflectionProbes</key> + <string>Selecionar probes de reflexão.</string> + <key>SelectionHighlightAlpha</key> + <string>Opacidade do destaque de seleção (0,0 = totalmente transparente, 1,0 = totalmente opaco).</string> + <key>SelectionHighlightAlphaTest</key> + <string>Valor de alpha abaixo do qual os pixels são exibidos na linha de destaque de seleção (0,0 = mostrar todos os pixels, 1,0 = não mostrar nenhum pixel).</string> + <key>SelectionHighlightThickness</key> + <string>Espessura da linha de destaque de seleção (fração da distância de visão).</string> + <key>SelectionHighlightUAnim</key> + <string>Taxa na qual a textura anima na direção U na linha de destaque de seleção (fração de textura por segundo).</string> + <key>SelectionHighlightUScale</key> + <string>Escala da exibição da textura na linha de destaque de seleção (fração do tamanho da textura).</string> + <key>SelectionHighlightVAnim</key> + <string>Taxa na qual a textura anima na direção V na linha de destaque de seleção (fração de textura por segundo).</string> + <key>SelectionHighlightVScale</key> + <string>Escala da exibição da textura na linha de destaque de seleção (fração do tamanho da textura).</string> + <key>ServerChoice</key> + <string>[NÃO MODIFICAR] Controla a qual grade você se conecta.</string> + <key>SessionSettingsFile</key> + <string>Configurações aplicadas por sessão (não salvas).</string> + <key>SettingsNextOwnerModify</key> + <string>A configuração de ambiente recém-criada pode ser modificada pelo próximo proprietário.</string> + <key>SettingsNextOwnerTransfer</key> + <string>A configuração de ambiente recém-criada pode ser revendida ou doada pelo próximo proprietário.</string> + <key>ShareWithGroup</key> + <string>(obsoleto) Objetos recém-criados são compartilhados com o grupo ativo no momento.</string> + <key>ShowAdultClassifieds</key> + <string>Exibir resultados de classificados marcados como adultos.</string> + <key>ShowAdultEvents</key> + <string>Exibir resultados de eventos marcados como adultos.</string> + <key>ShowAdultLand</key> + <string>Exibir resultados de vendas de terreno marcadas como adultas.</string> + <key>ShowAdultSims</key> + <string>Exibir resultados de buscar lugares ou populares que estejam em sims adultos.</string> + <key>ShowAllObjectHoverTip</key> + <string>Mostrar dica descritiva quando o mouse passa sobre objetos não interativos e interativos.</string> + <key>ShowAxes</key> + <string>Renderizar o sistema de coordenadas na sua posição.</string> + <key>ShowBanLines</key> + <string>Mostrar bordas de banimento/acesso no mundo, 0 - não mostrar, 1 - mostrar em colisão, 2 - mostrar por proximidade.</string> + <key>ShowBetaGrids</key> + <string>Exibir as grades beta no controle de seleção de grade.</string> + <key>ShowBlockedConvHistory</key> + <string>Especifica se agentes bloqueados serão mostrados no registro de chamadas.</string> + <key>ShowBuildButton</key> + <string>Mostra/oculta o botão de construir na bandeja inferior.</string> + <key>ShowCameraButton</key> + <string>Mostra/oculta o botão de visão na bandeja inferior.</string> + <key>ShowConsoleWindow</key> + <string>Mostrar o log em uma janela separada do SO.</string> + <key>ShowCrosshairs</key> + <string>Exibir a mira no modo mouselook.</string> + <key>ShowDebugConsole</key> + <string>Exibir console de depuração.</string> + <key>ShowDeviceSettings</key> + <string>Mostrar configurações de dispositivo.</string> + <key>ShowDiscordActivityDetails</key> + <string>Quando ativado, mostrar o nome do avatar no Discord Rich Presence.</string> + <key>ShowDiscordActivityState</key> + <string>Quando ativado, mostrar a localização no Discord Rich Presence.</string> + <key>ShowEventRecorderMenuItems</key> + <string>Se as opções de menu do Gravador de Eventos - Iniciar / Parar gravação - devem aparecer no menu Desenvolver (atualmente).</string> + <key>ShowFavoritesOnLogin</key> + <string>Define se os favoritos do último usuário logado serão salvos ao sair e exibidos na tela de login.</string> + <key>ShowGestureButton</key> + <string>Mostra/oculta o botão de gesto na bandeja inferior.</string> + <key>ShowHelpOnFirstLogin</key> + <string>Mostrar o floater de Ajuda no primeiro login.</string> + <key>ShowHoverTips</key> + <string>Mostrar dica descritiva quando o mouse passa sobre itens no mundo.</string> + <key>ShowInInventory</key> + <string>Abre automaticamente o inventário para mostrar os objetos aceitos.</string> + <key>ShowLandHoverTip</key> + <string>Mostrar dica descritiva quando o mouse passa sobre o terreno.</string> + <key>ShowMatureClassifieds</key> + <string>Exibir resultados de classificados marcados como moderados.</string> + <key>ShowMatureEvents</key> + <string>Exibir resultados de eventos marcados como moderados.</string> + <key>ShowMatureGroups</key> + <string>Incluir grupos marcados como maduros nos resultados de busca.</string> + <key>ShowMatureLand</key> + <string>Exibir resultados de vendas de terreno marcadas como moderadas.</string> + <key>ShowMatureSims</key> + <string>Exibir resultados de buscar lugares ou populares que estejam em sims moderados.</string> + <key>ShowMiniLocationPanel</key> + <string>Mostrar/ocultar o mini painel de localização.</string> + <key>ShowMiniMapButton</key> + <string>Mostra/oculta o botão de minimapa na bandeja inferior.</string> + <key>ShowMoveButton</key> + <string>Mostra/oculta o botão de mover na bandeja inferior.</string> + <key>ShowMyComplexityChanges</key> + <string>Por quanto tempo mostrar avisos sobre a complexidade do avatar (defina zero para desativar esses avisos).</string> + <key>ShowNavbarFavoritesPanel</key> + <string>Mostrar/ocultar o painel de favoritos da barra de navegação.</string> + <key>ShowNavbarNavigationPanel</key> + <string>Mostrar/ocultar o painel de navegação da barra de navegação.</string> + <key>ShowNearClip</key> + <string>Mostrar o plano de recorte próximo (near clip) na visualização.</string> + <key>ShowNetStats</key> + <string>Mostrar os indicadores de status de uso do viewer e da rede na sobreposição de status.</string> + <key>ShowNewInventory</key> + <string>Visualiza automaticamente novos notecards/texturas/landmarks.</string> + <key>ShowObjectRenderingCost</key> + <string>Mostrar o custo de renderização do objeto nas ferramentas de construção.</string> + <key>ShowObjectUpdates</key> + <string>Mostrar quando mensagens de atualização são recebidas para objetos individuais.</string> + <key>ShowOfferedInventory</key> + <string>Mostrar a janela de inventário com a última oferta de inventário selecionada ao receber inventário de outros usuários.</string> + <key>ShowOverlayTitle</key> + <string>Imprime uma mensagem de marca d'água na tela.</string> + <key>ShowPGClassifieds</key> + <string>Exibir resultados de classificados marcados como gerais.</string> + <key>ShowPGEvents</key> + <string>Exibir resultados de eventos marcados como gerais.</string> + <key>ShowPGLand</key> + <string>Exibir resultados de vendas de terreno marcadas como gerais.</string> + <key>ShowPGSims</key> + <string>Exibir resultados de buscar lugares ou populares que estejam em sims gerais.</string> + <key>ShowParcelOwners</key> + <string>Mostrar nomes dos proprietários das parcelas.</string> + <key>ShowPermissions</key> + <string>Mostrar permissões de objetos (configuração de depuração legada).</string> + <key>ShowPropertyLines</key> + <string>Mostrar sobreposição de linhas demarcando os limites de propriedade.</string> + <key>ShowScriptErrors</key> + <string>Mostrar erros de script.</string> + <key>ShowScriptErrorsLocation</key> + <string>Mostrar erro de script no chat (0) ou em janela (1).</string> + <key>ShowSearchButton</key> + <string>Mostra/oculta o botão de busca na bandeja inferior.</string> + <key>ShowSelectionBeam</key> + <string>Mostrar o feixe de partículas de seleção ao selecionar ou interagir com objetos.</string> + <key>ShowSnapshotButton</key> + <string>Mostra/oculta o botão de captura na bandeja inferior.</string> + <key>ShowStartLocation</key> + <string>Exibir o menu de local de início na tela de login.</string> + <key>ShowTangentBasis</key> + <string>Renderizar normal e binormal (depuração de bump mapping).</string> + <key>ShowTunedART</key> + <string>Mostrar o tempo de renderização atual, não o tempo pré-ajuste, na exibição do avatar.</string> + <key>ShowTutorial</key> + <string>Mostrar a janela de tutorial no login.</string> + <key>ShowVoiceChannelPopup</key> + <string>Controla a visibilidade do pop-up do canal de voz atual acima da aba de voz.</string> + <key>ShowVoiceVisualizersInCalls</key> + <string>Ativa visualizadores de voz no mundo, gestos de voz e sincronia labial durante chamadas em grupo ou P2P.</string> + <key>ShowVolumeSettingsPopup</key> + <string>Mostrar controle de volume individual para voz, efeitos sonoros, etc.</string> + <key>ShowWorldMapButton</key> + <string>Mostra/oculta o botão de mapa na bandeja inferior.</string> + <key>SimPendingUploads</key> + <string>Modo de estatística no painel de Estatísticas.</string> + <key>SimulateFBOFailure</key> + <string>[DEPURAÇÃO] Fazer allocateScreenBuffer retornar falso. Usado para testar o tratamento de erros.</string> + <key>SingleModeDoubleClickOpenWindow</key> + <string>Define a ação do duplo clique em pasta na visão de pasta única (0 - permanece na janela atual, 1 - abre uma nova janela).</string> + <key>SkinCurrent</key> + <string>O skin selecionado no momento.</string> + <key>SkinningSettingsFile</key> + <string>Nome do arquivo de configuração de cor do skin do cliente (por instalação).</string> + <key>SkipBenchmark</key> + <string>Se verdadeiro, desativa a execução do benchmark de GPU na inicialização (padrão para classe 1).</string> + <key>SkyAmbientScale</key> + <string>Controla a intensidade da luz ambiente, ou não direcional, do sol e da lua (fração ou múltiplo do nível de ambiente padrão).</string> + <key>SkyMoonDefaultPosition</key> + <string>Posição padrão do sol no céu (direção em coordenadas do mundo).</string> + <key>SkyNightColorShift</key> + <string>Controla a cor do luar (cor base aplicada à lua como fonte de luz).</string> + <key>SkyOverrideSimSunPosition</key> + <string>Substituir a posição do sol do simulador pela posição local definida.</string> + <key>SkySunDefaultPosition</key> + <string>Posição padrão do sol no céu (direção em coordenadas do mundo).</string> + <key>SnapEnabled</key> + <string>Ativar encaixe na grade.</string> + <key>SnapMargin</key> + <string>Controla a distância máxima entre janelas antes que elas se encaixem automaticamente (pixels).</string> + <key>SnapToMouseCursor</key> + <string>Ao encaixar na grade, centralizar o objeto no ponto de grade mais próximo do cursor do mouse.</string> + <key>SnapshotBaseDir</key> + <string>Caminho do último local de salvamento de capturas.</string> + <key>SnapshotBaseName</key> + <string>Padrão de nomenclatura das capturas.</string> + <key>SnapshotFormat</key> + <string>Salvar capturas neste formato (0 = PNG, 1 = JPEG, 2 = BMP).</string> + <key>SnapshotQuality</key> + <string>Configuração de qualidade dos JPEGs de cartão postal (0 = pior, 100 = melhor).</string> + <key>SocialPhotoResolution</key> + <string>Resolução padrão ao compartilhar foto usando os floaters sociais.</string> + <key>Socks5AuthType</key> + <string>Mecanismo de autenticação selecionado para o Socks5.</string> + <key>Socks5ProxyEnabled</key> + <string>Usar Proxy Socks5.</string> + <key>Socks5ProxyHost</key> + <string>Host do Proxy Socks 5.</string> + <key>Socks5ProxyPort</key> + <string>Porta do Proxy Socks 5.</string> + <key>SortFriendsFirst</key> + <string>Especifica se os amigos serão classificados primeiro no registro de chamadas.</string> + <key>SoundUploadFolder</key> + <string>Todos os uploads de sons serão armazenados neste diretório (UUID).</string> + <key>SpeakerParticipantRemoveDelay</key> + <string>Timeout para remover participantes que não estão no canal antes de removê-los da lista de oradores ativos (chat de texto/voz).</string> + <key>SpeedTest</key> + <string>Modo de teste de desempenho, sem rede.</string> + <key>SpellCheck</key> + <string>Verificação ortográfica.</string> + <key>SpellCheckDictionary</key> + <string>Dicionários primário e secundário atuais usados na verificação ortográfica.</string> + <key>StartUpToastLifeTime</key> + <string>Número de segundos em que um toast de inicialização existe.</string> + <key>StatsAutoRun</key> + <string>Reproduzir piloto automático.</string> + <key>StatsFile</key> + <string>Nome do arquivo de saída do log de estatísticas.</string> + <key>StatsFrametimeEventThreshold</key> + <string>O percentual que a diferença de frametime deve exceder para registrar um evento de frametime. 0,1 = 10%, 0,25 = 25%, etc.</string> + <key>StatsFrametimeSampleSeconds</key> + <string>O número de segundos para amostrar dados estendidos de frametime (percentis, desvio padrão).</string> + <key>StatsNumRuns</key> + <string>Repetir a reprodução do piloto automático este número de vezes.</string> + <key>StatsPilotFile</key> + <string>Nome do arquivo do caminho do piloto automático do log de estatísticas.</string> + <key>StatsPilotXMLFile</key> + <string>Nome do arquivo do caminho estendido do piloto automático do log de estatísticas.</string> + <key>StatsQuitAfterRuns</key> + <string>Encerrar o aplicativo após este número de execuções de reprodução do piloto automático.</string> + <key>StatsReportFileInterval</key> + <string>Intervalo para salvar os dados do arquivo de estatísticas do viewer.</string> + <key>StatsReportMaxDuration</key> + <string>Máximo de segundos para os dados do arquivo de estatísticas do viewer, evita arquivos enormes.</string> + <key>StatsReportSkipZeroDataSaves</key> + <string>No arquivo de dados de estatísticas do viewer, pular o salvamento da entrada se não houver dados.</string> + <key>StatsSessionTrackFrameStats</key> + <string>Rastrear estatísticas de renderização e de rede.</string> + <key>StatsSummaryFile</key> + <string>Nome do arquivo de resumo do log de estatísticas.</string> + <key>SwitchToSharedEnvAfterTeleport</key> + <string>Alternar para o ambiente compartilhado após o teletransporte.</string> + <key>SyncMaterialSettings</key> + <string>Sincronizar configurações de material.</string> + <key>SystemLanguage</key> + <string>Idioma indicado pelas configurações do sistema (para a interface).</string> + <key>TabToTextFieldsOnly</key> + <string>A tecla TAB leva você ao próximo campo de entrada de texto, em vez do próximo widget.</string> + <key>TargetFPS</key> + <string>FPS mínimo desejado.</string> + <key>TeleportArrivalDelay</key> + <string>Tempo a aguardar antes de exibir o mundo durante o teletransporte (segundos).</string> + <key>TeleportLocalDelay</key> + <string>Atraso para evitar teletransportes após iniciar um teletransporte dentro do sim (segundos).</string> + <key>TerrainColorHeightRange</key> + <string>Faixa de altitude na qual uma dada textura de terreno tem efeito (metros).</string> + <key>TerrainColorStartHeight</key> + <string>Altitude inicial para a texturização do terreno (metros).</string> + <key>TerrainPaintBitDepth</key> + <string>Profundidade de bits para futuras operações de paint map de terreno. Mín: 1. Máx: 8. Tem efeito quando o paint map é criado ou modificado. Modificações em um paintmap existente de profundidade de bits diferente terão precisão menor.</string> + <key>TerrainPaintResolution</key> + <string>Resolução do paint map do terreno em pixels. Arredondada para uma potência de dois. Mín: 16. Máx: RenderMaxTextureResolution. Tem efeito quando o paint map é criado.</string> + <key>TestGridStatusRSSFromFile</key> + <string>Apenas para testes: não atualizar o arquivo xml do rss a partir do servidor.</string> + <key>TextureCameraBoost</key> + <string>Quanto impulsionar a resolução de texturas que são importantes para a câmera.</string> + <key>TextureChannelPriority</key> + <string>Agressividade do streaming de textura por canal. X=normais, Y=difuso, Z=especular/metálico, W=emissivo. 1,0=base, maior=redução de resolução mais agressiva.</string> + <key>TextureDecodeDisabled</key> + <string>Se TRUE, não buscar nem decodificar nenhuma textura.</string> + <key>TextureDisable</key> + <string>Se TRUE, não carregar texturas para o conteúdo no mundo.</string> + <key>TextureDiscardBackgroundedTime</key> + <string>Especifica quanto tempo aguardar antes de descartar os dados de textura após o viewer ir para segundo plano (zero ou negativo para desativar).</string> + <key>TextureDiscardLevel</key> + <string>Especifica a resolução da textura (0 = mais alta, 5 = mais baixa).</string> + <key>TextureDiscardMinimizedTime</key> + <string>Especifica quanto tempo aguardar antes de descartar os dados de textura após o viewer ser minimizado (zero ou negativo para desativar).</string> + <key>TextureFetchConcurrency</key> + <string>Número máximo de conexões HTTP usadas para buscas de textura.</string> + <key>TextureFetchFakeFailureRate</key> + <string>Simular falhas de busca HTTP para algumas texturas assadas no servidor.</string> + <key>TextureFetchMinTimeToLog</key> + <string>Se o tempo de busca de textura exceder este valor, o testador de busca de textura registrará informações.</string> + <key>TextureFetchUpdateMinCount</key> + <string>Número mínimo de texturas a atualizar por quadro.</string> + <key>TextureLivePreview</key> + <string>Pré-visualizar seleções no seletor de textura ou de material imediatamente.</string> + <key>TextureLoadFullRes</key> + <string>Se TRUE, sempre carregar texturas em resolução total (discard = 0).</string> + <key>TextureLoggingThreshold</key> + <string>Especifica o limiar em bytes a partir do qual os dados de download de textura devem ser enviados ao sim.</string> + <key>TextureNewByteRange</key> + <string>Usar o novo cálculo de faixa de bytes mais preciso para os níveis de descarte j2c.</string> + <key>TextureReverseByteRange</key> + <string>Percentual mínimo da faixa de bytes ótima permitido para renderizar um dado nível de descarte.</string> + <key>TextureSaveLocation</key> + <string>Localização atual para salvar texturas em massa no disco.</string> + <key>TextureScaleMaxAreaFactor</key> + <string>Limita o quanto a escala da textura afeta o cálculo de área.</string> + <key>TextureScaleMinAreaFactor</key> + <string>Limita o quanto a escala da textura afeta o cálculo de área.</string> + <key>TextureUploadFolder</key> + <string>Todos os uploads de imagens (texturas) serão armazenados neste diretório (UUID).</string> + <key>ThreadPoolSizes</key> + <string>Mapa de substituições de tamanho para pools de threads específicos.</string> + <key>ThrottleBandwidthKBPS</key> + <string>Largura de banda máxima permitida de download (kilobits por segundo).</string> + <key>TipToastMessageLineCount</key> + <string>Contagem máxima de linhas da mensagem de texto no toast de dica.</string> + <key>ToastButtonWidth</key> + <string>Largura padrão dos botões no toast. Notas: se a largura necessária for menor que esta, o botão será redimensionado para o tamanho padrão, caso contrário para o necessário. A alteração deste parâmetro afetará o layout dos botões no toast de notificação.</string> + <key>ToastFadingTime</key> + <string>Número de segundos em que um toast desaparece.</string> + <key>ToastGap</key> + <string>Espaço entre toasts na tela (valor mín. é 5).</string> + <key>ToolTipDelay</key> + <string>Segundos antes de exibir a dica quando o mouse para sobre um elemento da interface.</string> + <key>ToolTipFadeTime</key> + <string>Segundos durante os quais a dica desaparece.</string> + <key>ToolTipFastDelay</key> + <string>Segundos antes de exibir a dica quando o mouse para sobre um elemento da interface (quando uma dica já está visível).</string> + <key>ToolTipVisibleTimeFar</key> + <string>Desaparecer a dica após o tempo passar (segundos) enquanto o mouse não está perto da dica.</string> + <key>ToolTipVisibleTimeNear</key> + <string>Desaparecer a dica após o tempo passar (segundos) enquanto o mouse está perto da dica ou da posição original.</string> + <key>ToolTipVisibleTimeOver</key> + <string>Desaparecer a dica após o tempo passar (segundos) enquanto o mouse está sobre a dica.</string> + <key>ToolboxAutoMove</key> + <string>[NÃO USADO]</string> + <key>TrackFocusObject</key> + <string>A câmera rastreia o último objeto no qual foi dado zoom.</string> + <key>TranslateChat</key> + <string>Traduzir mensagens de chat recebidas.</string> + <key>TranslateLanguage</key> + <string>Especificador do idioma de tradução.</string> + <key>TranslatingEnabled</key> + <string>Preferências de tradução definidas.</string> + <key>TranslationService</key> + <string>API de tradução a usar. (google|azure).</string> + <key>TuningFPSStrategy</key> + <string>Estratégia a usar ao ajustar o FPS. 0=Ajustar apenas a renderização de avatares, 1=Ajustar tanto avatares quanto configurações globais da cena, 2=Ajustar apenas a cena global.</string> + <key>TutorialURL</key> + <string>URL do item de menu de tutorial, definida automaticamente durante o login.</string> + <key>TypeAheadTimeout</key> + <string>Atraso antes de limpar o buffer de digitação antecipada nas listas (segundos).</string> + <key>UIAutoScale</key> + <string>Manter a escala da interface consistente entre diferentes resoluções.</string> + <key>UIButtonOrigHPad</key> + <string>Preenchimento horizontal original do botão da interface.</string> + <key>UICheckboxctrlHPad</key> + <string>Preenchimento horizontal do controle de caixa de seleção da interface.</string> + <key>UICheckboxctrlSpacing</key> + <string>Espaçamento do controle de caixa de seleção da interface.</string> + <key>UICheckboxctrlVPad</key> + <string>Preenchimento vertical do controle de caixa de seleção da interface.</string> + <key>UICloseBoxFromTop</key> + <string>Distância do topo do floater até o topo do ícone da caixa de fechar, em pixels.</string> + <key>UIExtraTriangleHeight</key> + <string>Altura do triângulo extra da interface.</string> + <key>UIExtraTriangleWidth</key> + <string>Largura do triângulo extra da interface.</string> + <key>UIFloaterCloseBoxSize</key> + <string>Tamanho da caixa de fechar do floater da interface.</string> + <key>UIFloaterHPad</key> + <string>Tamanho do preenchimento horizontal do floater da interface.</string> + <key>UIFloaterTestBool</key> + <string>Exemplo de configuração salva para o floater de teste.</string> + <key>UIImgDefaultAlphaUUID</key> + <string>UUID da textura padrão de alpha usada no editor de aparência.</string> + <key>UIImgDefaultEyesUUID</key> + <string>UUID da textura padrão de íris usada no editor de aparência.</string> + <key>UIImgDefaultGlovesUUID</key> + <string>UUID da textura padrão de luvas usada no editor de aparência.</string> + <key>UIImgDefaultHairUUID</key> + <string>UUID da textura padrão de cabelo usada no editor de aparência.</string> + <key>UIImgDefaultJacketUUID</key> + <string>UUID da textura padrão de jaqueta usada no editor de aparência.</string> + <key>UIImgDefaultPantsUUID</key> + <string>UUID da textura padrão de calça usada no editor de aparência.</string> + <key>UIImgDefaultShirtUUID</key> + <string>UUID da textura padrão de camisa usada no editor de aparência.</string> + <key>UIImgDefaultShoesUUID</key> + <string>UUID da textura padrão de sapatos usada no editor de aparência.</string> + <key>UIImgDefaultSkirtUUID</key> + <string>UUID da textura padrão de saia usada no editor de aparência.</string> + <key>UIImgDefaultSocksUUID</key> + <string>UUID da textura padrão de meias usada no editor de aparência.</string> + <key>UIImgDefaultUnderwearUUID</key> + <string>UUID da textura padrão de roupa íntima usada no editor de aparência.</string> + <key>UILineEditorCursorThickness</key> + <string>Espessura do cursor do editor de linha da interface.</string> + <key>UIMaxComboWidth</key> + <string>Largura máxima da caixa de combinação.</string> + <key>UIMinimizedWidth</key> + <string>Tamanho da largura minimizada do floater da interface.</string> + <key>UIMultiSliderctrlSpacing</key> + <string>Espaçamento do controle de múltiplos sliders da interface.</string> + <key>UIMultiTrackHeight</key> + <string>Altura da múltipla trilha da interface.</string> + <key>UIPreeditMarkerBrightness</key> + <string>Brilho do marcador de pré-edição da interface.</string> + <key>UIPreeditMarkerGap</key> + <string>Espaçamento do marcador de pré-edição da interface.</string> + <key>UIPreeditMarkerPosition</key> + <string>Posição do marcador de pré-edição da interface.</string> + <key>UIPreeditMarkerThickness</key> + <string>Espessura do marcador de pré-edição da interface.</string> + <key>UIPreeditStandoutBrightness</key> + <string>Brilho do destaque de pré-edição da interface.</string> + <key>UIPreeditStandoutGap</key> + <string>Espaçamento do destaque de pré-edição da interface.</string> + <key>UIPreeditStandoutPosition</key> + <string>Posição do destaque de pré-edição da interface.</string> + <key>UIPreeditStandoutThickness</key> + <string>Espessura do destaque de pré-edição da interface.</string> + <key>UIPreviewMaterial</key> + <string>Se a amostra de material PBR está ou não ativada.</string> + <key>UIResizeBarHeight</key> + <string>Tamanho da altura da barra de redimensionamento da interface.</string> + <key>UIScaleFactor</key> + <string>Tamanho da interface em relação ao layout padrão em tela de 1024x768.</string> + <key>UIScrollbarSize</key> + <string>Tamanho da barra de rolagem da interface.</string> + <key>UISliderctrlHeight</key> + <string>Altura do controle de slider da interface.</string> + <key>UISliderctrlSpacing</key> + <string>Espaçamento do controle de slider da interface.</string> + <key>UISndAlert</key> + <string>Arquivo de som para alertas (uuid do recurso de som).</string> + <key>UISndBadKeystroke</key> + <string>Arquivo de som para tecla inválida (uuid do recurso de som).</string> + <key>UISndChatMention</key> + <string>Arquivo de som para menção em chat (uuid do recurso de som).</string> + <key>UISndChatPing</key> + <string>Arquivo de som para ping de chat (uuid do recurso de som).</string> + <key>UISndClick</key> + <string>Arquivo de som para clique do mouse (uuid do recurso de som).</string> + <key>UISndClickRelease</key> + <string>Arquivo de som para soltar o botão do mouse (uuid do recurso de som).</string> + <key>UISndDebugSpamToggle</key> + <string>Registrar efeitos sonoros da interface conforme são reproduzidos.</string> + <key>UISndHealthReductionF</key> + <string>Arquivo de som para dor feminina (uuid do recurso de som).</string> + <key>UISndHealthReductionM</key> + <string>Arquivo de som para dor masculina (uuid do recurso de som).</string> + <key>UISndHealthReductionThreshold</key> + <string>Quantidade de redução de saúde necessária para acionar o som de "dor".</string> + <key>UISndInvalidOp</key> + <string>Arquivo de som para operações inválidas (uuid do recurso de som).</string> + <key>UISndMoneyChangeDown</key> + <string>Arquivo de som para aumento do saldo de L$ (uuid do recurso de som).</string> + <key>UISndMoneyChangeThreshold</key> + <string>Quantidade de mudança no saldo de L$ necessária para acionar o som de "dinheiro".</string> + <key>UISndMoneyChangeUp</key> + <string>Arquivo de som para diminuição do saldo de L$ (uuid do recurso de som).</string> + <key>UISndNewIncomingIMSession</key> + <string>Arquivo de som para nova sessão de mensagem instantânea (uuid do recurso de som).</string> + <key>UISndObjectCreate</key> + <string>Arquivo de som para criação de objeto (uuid do recurso de som).</string> + <key>UISndObjectDelete</key> + <string>Arquivo de som para exclusão de objeto (uuid do recurso de som).</string> + <key>UISndObjectRezIn</key> + <string>Arquivo de som para surgimento (rez) de objetos (uuid do recurso de som).</string> + <key>UISndObjectRezOut</key> + <string>Arquivo de som para desaparecimento (derez) de objetos (uuid do recurso de som).</string> + <key>UISndRestart</key> + <string>Arquivo de som para reinício de região (uuid do recurso de som).</string> + <key>UISndSnapshot</key> + <string>Arquivo de som para tirar uma captura (uuid do recurso de som).</string> + <key>UISndStartIM</key> + <string>Arquivo de som para iniciar uma nova sessão de IM (uuid do recurso de som).</string> + <key>UISndTeleportOut</key> + <string>Arquivo de som para teletransporte (uuid do recurso de som).</string> + <key>UISndTyping</key> + <string>Arquivo de som para começar a digitar uma mensagem de chat (uuid do recurso de som).</string> + <key>UISndWindowClose</key> + <string>Arquivo de som para fechar uma janela (uuid do recurso de som).</string> + <key>UISndWindowOpen</key> + <string>Arquivo de som para abrir uma janela (uuid do recurso de som).</string> + <key>UISpinctrlBtnHeight</key> + <string>Altura do botão do controle giratório da interface.</string> + <key>UISpinctrlBtnWidth</key> + <string>Largura do botão do controle giratório da interface.</string> + <key>UISpinctrlSpacing</key> + <string>Espaçamento do controle giratório da interface.</string> + <key>UITabCntrArrowBtnSize</key> + <string>Tamanho do botão de seta do contêiner de abas da interface.</string> + <key>UITabCntrButtonPanelOverlap</key> + <string>Sobreposição do painel de botões do contêiner de abas da interface.</string> + <key>UITabCntrCloseBtnSize</key> + <string>Tamanho do botão de fechar do contêiner de abas da interface.</string> + <key>UITabCntrTabHPad</key> + <string>Preenchimento horizontal da aba do contêiner de abas da interface.</string> + <key>UITabCntrTabPartialWidth</key> + <string>Largura parcial da aba do contêiner de abas da interface.</string> + <key>UITabCntrVertTabMinWidth</key> + <string>Largura mínima da aba vertical do contêiner de abas da interface.</string> + <key>UITabCntrvArrowBtnSize</key> + <string>Tamanho do botão de seta vertical do contêiner de abas da interface.</string> + <key>UITabCntrvPad</key> + <string>Preenchimento vertical do contêiner de abas da interface.</string> + <key>UITabPadding</key> + <string>Preenchimento da aba da interface.</string> + <key>UpdateAppWindowTitleBar</key> + <string>Atualiza a barra de título da janela do aplicativo com informações breves sobre usuário/localização.</string> + <key>UpdateRememberPasswordSetting</key> + <string>Salvar a configuração de 'lembrar senha' para o usuário atual.</string> + <key>UpdaterServiceSetting</key> + <string>Configurar o serviço de atualização.</string> + <key>UpdaterShowReleaseNotes</key> + <string>Ativa a exibição das notas de versão em um floater web após a atualização. 0 - não mostrar, 1 - mostrar, 2 - mostrar mesmo para viewers de teste.</string> + <key>UpdaterWillingToTest</key> + <string>Se o atualizador deve ou não oferecer upgrades Beta.</string> + <key>UploadBakedTexOld</key> + <string>Força o pipeline de texturas assadas a fazer upload usando o método antigo.</string> + <key>UploadsEveryoneCopy</key> + <string>Todos podem copiar o item recém-enviado.</string> + <key>UploadsNextOwnerCopy</key> + <string>Itens recém-enviados podem ser copiados pelo próximo proprietário.</string> + <key>UploadsNextOwnerModify</key> + <string>Itens recém-enviados podem ser modificados pelo próximo proprietário.</string> + <key>UploadsNextOwnerTransfer</key> + <string>Itens recém-enviados podem ser revendidos ou doados pelo próximo proprietário.</string> + <key>UploadsShareWithGroup</key> + <string>Itens recém-enviados são compartilhados com o grupo ativo no momento.</string> + <key>Use24HourClock</key> + <string>12 vs 24. No momento a cobertura é parcial.</string> + <key>UseAltKeyForMenus</key> + <string>Acessar menus pelo teclado tocando Alt.</string> + <key>UseChatBubbles</key> + <string>Mostrar o chat acima da cabeça dos avatares em balões de chat.</string> + <key>UseCircuitCodeMaxRetries</key> + <string>Contagem máxima de timeout para a mensagem inicial UseCircuitCode.</string> + <key>UseCircuitCodeTimeout</key> + <string>Duração do timeout em segundos para a mensagem inicial UseCircuitCode.</string> + <key>UseDebugLogin</key> + <string>Fornece controle extra sobre a qual grade se conectar.</string> + <key>UseDebugMenus</key> + <string>Ativa o menu "Debug".</string> + <key>UseDefaultColorPicker</key> + <string>Usar o seletor de cores fornecido pelo sistema operacional.</string> + <key>UseDisplayNames</key> + <string>Usar nomes novos, alteráveis e em unicode.</string> + <key>UseEnergy</key> + <string>Enviar mensagens de energia ao simulador (configuração de depuração legada).</string> + <key>UseFreezeFrame</key> + <string>Congelar o tempo ao tirar capturas.</string> + <key>UseGroupMemberPagination</key> + <string>Ativar paginação da lista de membros do grupo, 50 membros por vez.</string> + <key>UseNewWalkRun</key> + <string>Substituir as animações padrão de caminhar/correr por novas.</string> + <key>UseObjectCacheOcclusion</key> + <string>Ativar culling de objetos no nível do cache de objetos com base na oclusão (cobertura) por outros objetos.</string> + <key>UseOcclusion</key> + <string>Ativar culling de objetos com base na oclusão (cobertura) por outros objetos.</string> + <key>UsePeopleAPI</key> + <string>Usar a cap da people API para busca de nomes de avatares; usar o protocolo legado antigo se falso. Requer reinício.</string> + <key>UseStartScreen</key> + <string>Se deve ou não carregar uma imagem de tela de início.</string> + <key>UseWebPagesOnPrims</key> + <string>[NÃO USADO]</string> + <key>UserConnectionPort</key> + <string>Porta na qual este cliente transmite.</string> + <key>UserLogFile</key> + <string>Nome do arquivo de log especificado pelo usuário.</string> + <key>UserLoginInfo</key> + <string>Dados de login do usuário.</string> + <key>UserSessionSettingsFile</key> + <string>Configurações do usuário aplicadas por sessão (não salvas).</string> + <key>VelocityInterpolate</key> + <string>Extrapolar o movimento do objeto a partir do último pacote com base na velocidade recebida.</string> + <key>VersionChannelName</key> + <string>Informações de versão geradas ao executar o viewer.</string> + <key>VoiceAutomaticGainControl</key> + <string>Controle automático de ganho de voz.</string> + <key>VoiceCallsFriendsOnly</key> + <string>Aceitar apenas chamadas de voz e receber IMs de residentes na sua lista de amigos.</string> + <key>VoiceCallsRejectGroup</key> + <string>Rejeitar silenciosamente todas as chamadas de voz de grupo recebidas.</string> + <key>VoiceDisableMic</key> + <string>Desativar completamente a capacidade de abrir o microfone.</string> + <key>VoiceEarLocation</key> + <string>Localização do ouvido virtual para voz.</string> + <key>VoiceEchoCancellation</key> + <string>Cancelamento de eco de voz.</string> + <key>VoiceEffectDefault</key> + <string>Morfologia de voz selecionada.</string> + <key>VoiceImageLevel0</key> + <string>UUID de textura para o nível de imagem de voz 0.</string> + <key>VoiceImageLevel1</key> + <string>UUID de textura para o nível de imagem de voz 1.</string> + <key>VoiceImageLevel2</key> + <string>UUID de textura para o nível de imagem de voz 2.</string> + <key>VoiceImageLevel3</key> + <string>UUID de textura para o nível de imagem de voz 3.</string> + <key>VoiceImageLevel4</key> + <string>UUID de textura para o nível de imagem de voz 4.</string> + <key>VoiceImageLevel5</key> + <string>UUID de textura para o nível de imagem de voz 5.</string> + <key>VoiceImageLevel6</key> + <string>UUID de textura para o nível de imagem de voz 6.</string> + <key>VoiceInputAudioDevice</key> + <string>Dispositivo de entrada de áudio a usar para voz.</string> + <key>VoiceMorphingEnabled</key> + <string>Se deve ou não ativar os Voice Morphs e mostrar a interface.</string> + <key>VoiceNoiseSuppressionLevel</key> + <string>Nível de supressão de ruído de voz.</string> + <key>VoiceOutputAudioDevice</key> + <string>Dispositivo de saída de áudio a usar para voz.</string> + <key>VoiceParticipantLeftRemoveDelay</key> + <string>Timeout para remover participantes que saíram do chat de voz da lista no painel de controles de voz.</string> + <key>VoiceServerType</key> + <string>O tipo de servidor de voz a usar para chamadas em grupo, conferência e p2p.</string> + <key>VoiceVisualizerEnabled</key> + <string>Exibir o indicador de ponto de voz acima de um avatar.</string> + <key>WLSkyDetail</key> + <string>Controla o detalhe de vértices no céu WindLight. Números menores dão melhor desempenho e céus mais feios.</string> + <key>WarningsAsChat</key> + <string>Exibir mensagens de aviso no histórico de chat.</string> + <key>WatchdogEnabled</key> + <string>Controla se o temporizador watchdog de threads é ativado. O valor é S32. Defina -1 para usar o padrão embutido.</string> + <key>WaterGLFogDensityScale</key> + <string>Mapeia a densidade da névoa de água do shader para a densidade da névoa do gl.</string> + <key>WaterGLFogDepthFloor</key> + <string>Controla quão escura a névoa de água do gl pode ficar.</string> + <key>WaterGLFogDepthScale</key> + <string>Controla quão rapidamente a névoa do gl escurece debaixo d'água.</string> + <key>WearFolderLimit</key> + <string>Limita o número de itens na pasta que podem ser substituídos/adicionados ao visual atual.</string> + <key>WearablesEveryoneCopy</key> + <string>Todos podem copiar a roupa ou parte do corpo recém-criada.</string> + <key>WearablesNextOwnerCopy</key> + <string>A roupa ou parte do corpo recém-criada pode ser copiada pelo próximo proprietário.</string> + <key>WearablesNextOwnerModify</key> + <string>A roupa ou parte do corpo recém-criada pode ser modificada pelo próximo proprietário.</string> + <key>WearablesNextOwnerTransfer</key> + <string>A roupa ou parte do corpo recém-criada pode ser revendida ou doada pelo próximo proprietário.</string> + <key>WearablesShareWithGroup</key> + <string>Roupas ou partes do corpo recém-criadas são compartilhadas com o grupo ativo no momento.</string> + <key>WebContentWindowLimit</key> + <string>Número máximo de janelas do navegador web que podem estar abertas ao mesmo tempo no floater de conteúdo web (0 para sem limite).</string> + <key>WebProfileFloaterRect</key> + <string>Dimensões do floater de perfil web.</string> + <key>WindLightUseAtmosShaders</key> + <string>OBSOLETO (apenas true é suportado) - Se deve ativar ou desativar os shaders atmosféricos WindLight.</string> + <key>WindowHeight</key> + <string>Altura da janela do viewer SL.</string> + <key>WindowMaximized</key> + <string>Janela do viewer SL maximizada no login.</string> + <key>WindowWidth</key> + <string>Largura da janela do viewer SL.</string> + <key>WindowX</key> + <string>Coordenada X do canto superior esquerdo da janela do viewer SL, relativa ao canto superior esquerdo da tela principal (pixels).</string> + <key>WindowY</key> + <string>Coordenada Y do canto superior esquerdo da janela do viewer SL, relativa ao canto superior esquerdo da tela principal (pixels).</string> + <key>XferThrottle</key> + <string>Largura de banda máxima permitida de download para transferências de asset (bits por segundo).</string> + <key>YawFromMousePosition</key> + <string>Faixa horizontal na qual a cabeça do avatar acompanha a posição do mouse (graus de rotação da cabeça da esquerda da janela até a direita).</string> + <key>YieldTime</key> + <string>Ceder algum tempo ao host local.</string> + <key>YouAreHereDistance</key> + <string>Raio de distância para o banner que indica se o residente está "no" Lugar (metros do avatar até o lugar solicitado).</string> + <key>ZoomDirect</key> + <string>Mapear o eixo de zoom do joystick diretamente para o zoom da câmera.</string> + <key>ZoomTime</key> + <string>Tempo de transição entre diferentes modos de câmera (segundos).</string> + <key>always_showable_floaters</key> + <string>Floaters que podem ser exibidos mesmo no modo mouselook.</string> + <key>max_texture_dimension_X</key> + <string>Largura máxima de textura para texturas enviadas pelo usuário.</string> + <key>max_texture_dimension_Y</key> + <string>Altura máxima de textura para texturas enviadas pelo usuário.</string> + <key>moapbeacon</key> + <string>Marcador / Destaque de fontes de mídia em prim.</string> + <key>moonbeacon</key> + <string>Mostrar a direção da Lua.</string> + <key>particlesbeacon</key> + <string>Marcador / Destaque de geradores de partículas.</string> + <key>physicalbeacon</key> + <string>Marcador / Destaque de objetos físicos.</string> + <key>renderbeacons</key> + <string>Marcador / Destaque de geradores de partículas.</string> + <key>renderhighlights</key> + <string>Marcador / Destaque de objetos com script e função de toque.</string> + <key>scriptsbeacon</key> + <string>Marcador / Destaque de objetos com script.</string> + <key>scripttouchbeacon</key> + <string>Marcador / Destaque de objetos com script e função de toque.</string> + <key>soundsbeacon</key> + <string>Marcador / Destaque de geradores de som.</string> + <key>sourceid</key> + <string>Identifica a agência de referência para os servidores web da Linden.</string> + <key>sunbeacon</key> + <string>Mostrar a direção do Sol.</string> + <key>teleport_offer_invitation_max_length</key> + <string>Comprimento máximo do editor da linha de convite de oferta de teletransporte. 254 - max_location_url_length(76) = 178.</string> +</map> +</llsd> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml index 9afcb67d3d..33bd389c01 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Descrição: </text> - <line_editor name="LabelItemDesc" tool_tip="Quando as pessoas selecionam 'Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/> + <text_editor name="LabelItemDesc" tool_tip="Quando as pessoas selecionam 'Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/> <text name="LabelCreatorTitle"> Criador: </text> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 34ddf434f2..bcbc2409ef 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -5406,9 +5406,6 @@ Tente colocar o caminho do editor entre aspas. <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> @@ -5505,9 +5502,6 @@ Tente colocar o caminho do editor entre aspas. <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> diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml index 22827bc397..435d242018 100644 --- a/indra/newview/skins/default/xui/ru/floater_about.xml +++ b/indra/newview/skins/default/xui/ru/floater_about.xml @@ -24,6 +24,8 @@ jpeg2000 (C) 2001, David Taubman, Университет Нового Южного Уэльса (UNSW) jpeglib (C) 1991-1998, Thomas G. Lane. ogg/vorbis (C) 2002, Xiphophorus + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine OpenSSL (C) 1998-2008 The OpenSSL Project. PCRE (c) 1997-2012, Кембриджский университет SDL (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga diff --git a/indra/newview/skins/default/xui/ru/floater_how_to.xml b/indra/newview/skins/default/xui/ru/floater_how_to.xml deleted file mode 100644 index 52525e5d33..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="ПОМОЩЬ"/> diff --git a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml index 30a196b1ca..65dd67c78a 100644 --- a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="СКРИПТ: СОЗДАТЬ СКРИПТ"> <floater.string name="not_allowed"> - Вы не можете просматривать и изменять этот скрипт, поскольку для него выбрана категория «не копируемые». Для просмотра или изменения скрипта в объекте нужны полные права доступа. + Вы не можете просматривать и изменять этот скрипт, поскольку для него выбрано «не копировать» или «не изменять». Для просмотра или изменения скрипта нужны эти права доступа. </floater.string> <floater.string name="script_running"> Выполняется diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index e75fd1fd82..96eb917e39 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -1459,7 +1459,6 @@ Ваш персонаж появится через мгновение. Для ходьбы нажимайте клавиши со стрелками. -В любой момент можно нажать клавишу F1 для получения справки или информации о [SECOND_LIFE]. Выберите мужской или женский аватар. Этот выбор затем можно будет изменить. <usetemplate name="okcancelbuttons" notext="Женщина" yestext="Мужчина"/> </notification> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml index 137e047d97..cec72ebe21 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Настройки прокси-сервера: </text> <button label="Задать настройки" label_selected="Обзор" name="set_proxy"/> + <text name="os_hibernation_mode"> + Предотвращать гибернацию ОС, если пользователь не отошел: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Предотвращает переход ОС в сон, только если пользователь не отошел"> + <combo_box.item label="Гибернация разрешена" name="can_hibernate"/> + <combo_box.item label="Гибернация запрещена, экран можно выключать" name="cant_hibernate"/> + <combo_box.item label="Гибернация запрещена, экран нельзя выключать" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_script_ed.xml b/indra/newview/skins/default/xui/ru/panel_script_ed.xml index 54a1eaab75..6322917e8e 100644 --- a/indra/newview/skins/default/xui/ru/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/ru/panel_script_ed.xml @@ -4,7 +4,7 @@ Загрузка... </panel.string> <panel.string name="can_not_view"> - Вы не можете просматривать и изменять этот скрипт, поскольку для него выбрана категория «не копируемые». Для просмотра или изменения скрипта в объекте нужны полные права доступа. + Вы не можете просматривать и изменять этот скрипт, поскольку для него выбрано «не копировать» или «не изменять». Для просмотра или изменения скрипта нужны эти права доступа. </panel.string> <panel.string name="public_objects_can_not_run"> Общедоступные объекты не могут запускать скрипты diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml index 79a645f536..e9e03fc52d 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Описание: </text> - <line_editor name="LabelItemDesc" tool_tip="Когда в настройках окна просмотра выбрано 'Всплывающие подсказки на всех объектах', у игроков появляется всплывающее окошко с описанием объекта при наведении мыши на любой объект. Описание примитива ограничивается 127 байтами и строка со значением, превышающим этот размер, усекается."/> + <text_editor name="LabelItemDesc" tool_tip="Когда в настройках окна просмотра выбрано 'Всплывающие подсказки на всех объектах', у игроков появляется всплывающее окошко с описанием объекта при наведении мыши на любой объект. Описание примитива ограничивается 127 байтами и строка со значением, превышающим этот размер, усекается."/> <text name="LabelCreatorTitle"> Создатель: </text> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 682acd9191..dcb884d340 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -5544,9 +5544,6 @@ support@secondlife.com. <string name="Command_Grid_Status_Label"> Состояние сетки </string> - <string name="Command_HowTo_Label"> - Инструкции - </string> <string name="Command_Inventory_Label"> Инвентарь </string> @@ -5643,9 +5640,6 @@ support@secondlife.com. <string name="Command_Grid_Status_Tooltip"> Показать текущее состояние сетки </string> - <string name="Command_HowTo_Tooltip"> - Выполнение типичных задач - </string> <string name="Command_Inventory_Tooltip"> Просмотр и использование вашего имущества </string> diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index ca21bee464..d01d0e88d3 100644 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -23,6 +23,8 @@ açık kaynak kod katkısında bulunanlar şunlardır:</text> Havok.com(TM) Telif Hakkı (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Telif Hakkı (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Telif Hakkı (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine ogg/vorbis Telif Hakkı (C) 2002, Xiphophorus OpenSSL Telif Hakkı (C) 1998-2008 The OpenSSL Project. PCRE Telif Hakkı (c) 1997-2012 University of Cambridge diff --git a/indra/newview/skins/default/xui/tr/floater_how_to.xml b/indra/newview/skins/default/xui/tr/floater_how_to.xml deleted file mode 100644 index a42fe0b122..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="NASIL YAPILIR"/> diff --git a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml index 760948edae..c53e12fc0e 100644 --- a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="KOMUT DOSYASI: YENİ KOMUT DOSYASI"> <floater.string name="not_allowed"> - Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü "kopyalanamaz" olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var. + Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü "kopyalanamaz" veya "değiştirilemez" olarak ayarlanmıştır. Bir komut dosyasını görüntülemek veya düzenlemek için bu izinlere ihtiyacınız var. </floater.string> <floater.string name="script_running"> Çalışıyor diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 17d2969d19..de429f3292 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -1460,7 +1460,6 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz. Karakteriniz birazdan görünecek. Yürümek için ok tuşlarını kullanın. -Yardım almak ya da [SECOND_LIFE] hakkında daha fazla bilgi edinmek için istediğiniz zaman F1 tuşuna basın. Lütfen bir erkek ya da kadın avatar seçin. Fikrinizi daha sonra değiştirebilirsiniz. <usetemplate name="okcancelbuttons" notext="Kadın" yestext="Erkek"/> </notification> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml index a20d0e5ff1..a3d99ac01f 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml @@ -36,4 +36,12 @@ Proxy Ayarları: </text> <button label="Proxy ayarlarını yap" label_selected="Gözat" name="set_proxy"/> + <text name="os_hibernation_mode"> + Uzakta değilse işletim sisteminin hazırda beklemesini engelle: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="Yalnızca kullanıcı uzakta değilse işletim sisteminin uykuya geçmesini engeller"> + <combo_box.item label="Hazırda bekleyebilir" name="can_hibernate"/> + <combo_box.item label="Hazırda bekleyemez, ekran kapanabilir" name="cant_hibernate"/> + <combo_box.item label="Hazırda bekleyemez, ekran kapanamaz" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_script_ed.xml b/indra/newview/skins/default/xui/tr/panel_script_ed.xml index 83040d06e4..e037a79e99 100644 --- a/indra/newview/skins/default/xui/tr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/tr/panel_script_ed.xml @@ -4,7 +4,7 @@ Yükleniyor... </panel.string> <panel.string name="can_not_view"> - Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü "kopyalanamaz" olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var. + Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü "kopyalanamaz" veya "değiştirilemez" olarak ayarlanmıştır. Bir komut dosyasını görüntülemek veya düzenlemek için bu izinlere ihtiyacınız var. </panel.string> <panel.string name="public_objects_can_not_run"> Kamuya Açık Nesneler komut dosyalarını çalıştıramaz diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml index 9c1b6a8dfd..fcee742590 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> Açıklama: </text> - <line_editor name="LabelItemDesc" tool_tip="Görüntüleyici ayarlarında 'İpuçlarını Tüm Nesnelerin Üzerine Getir' seçildiğinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/> + <text_editor name="LabelItemDesc" tool_tip="Görüntüleyici ayarlarında 'İpuçlarını Tüm Nesnelerin Üzerine Getir' seçildiğinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/> <text name="LabelCreatorTitle"> Oluşturan: </text> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 5c3f7ae256..c3db659e29 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -5539,9 +5539,6 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Grid_Status_Label"> Ağ durumu </string> - <string name="Command_HowTo_Label"> - Nasıl yapılır - </string> <string name="Command_Inventory_Label"> Envanter </string> @@ -5638,9 +5635,6 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Grid_Status_Tooltip"> Ağın mevcut durumunu göster </string> - <string name="Command_HowTo_Tooltip"> - Genel görevleri nasıl yapacağınız - </string> <string name="Command_Inventory_Tooltip"> Eşyalarınızı görüntüleyin ve kullanın </string> diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 727f598894..4c23beca30 100644 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -23,6 +23,8 @@ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + luau Copyright (c) 1994–2019 Lua.org, PUC-Rio / Copyright (c) 2019-2024 Roblox Corporation + 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 diff --git a/indra/newview/skins/default/xui/zh/floater_how_to.xml b/indra/newview/skins/default/xui/zh/floater_how_to.xml deleted file mode 100644 index e033327165..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_how_to.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_how_to" title="簡易教學"/> diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml index e971b166f7..ed7c127a6c 100644 --- a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="腳本: 新腳本"> <floater.string name="not_allowed"> - 你無法察看或編輯這腳本,它被設為「禁止複製」。 你需要完整權限去察看或編輯物件內的腳本。 + 你無法察看或編輯這腳本,因為它被設為「禁止複製」或「禁止修改」。你需要這些權限才能察看或編輯腳本。 </floater.string> <floater.string name="script_running"> 執行中 diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 4d0f1cb85b..fd0b613dd6 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -1446,7 +1446,6 @@ 你的人物很快將會出現。 用方向鍵行走。 -任何時候你都可按 F1 鍵察看幫助,進一步瞭解 [SECOND_LIFE]。 請選擇男性或女性化身。 以後你仍可改變這個選擇。 <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> </notification> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml index 6ef25ad96e..c83a7512e0 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml @@ -36,4 +36,12 @@ 代理伺服器設定: </text> <button label="調整代理伺服器設定" label_selected="瀏覽" name="set_proxy"/> + <text name="os_hibernation_mode"> + 不處於離開狀態時阻止作業系統休眠: + </text> + <combo_box name="os_hibernation_combobox" tool_tip="僅在使用者不處於離開狀態時阻止作業系統睡眠"> + <combo_box.item label="可休眠" name="can_hibernate"/> + <combo_box.item label="不可休眠,可關閉螢幕" name="cant_hibernate"/> + <combo_box.item label="不可休眠,不可關閉螢幕" name="cant_hibernate_screen"/> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml index c64982b397..a7f071806c 100644 --- a/indra/newview/skins/default/xui/zh/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml @@ -4,7 +4,7 @@ 載入中... </panel.string> <panel.string name="can_not_view"> - 你無法察看或編輯這腳本,它被設為「禁止複製」。 你需要完整權限去察看或編輯物件內的腳本。 + 你無法察看或編輯這腳本,因為它被設為「禁止複製」或「禁止修改」。你需要這些權限才能察看或編輯腳本。 </panel.string> <panel.string name="public_objects_can_not_run"> 公開物件不能執行腳本 diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml index 61c52066d0..4737fe8776 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml @@ -38,7 +38,7 @@ <text name="LabelItemDescTitle"> 描述: </text> - <line_editor name="LabelItemDesc" tool_tip="當人們在瀏覽器設定中選擇了「針對所有物件懸置顯示提醒」時,他們滑鼠所指的物件將會彈出描述該物件的內容。 幾何元件的描述內容不得超過127位元組,否則會被截短。"/> + <text_editor name="LabelItemDesc" tool_tip="當人們在瀏覽器設定中選擇了「針對所有物件懸置顯示提醒」時,他們滑鼠所指的物件將會彈出描述該物件的內容。 幾何元件的描述內容不得超過127位元組,否則會被截短。"/> <text name="LabelCreatorTitle"> 創造者: </text> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index cf6fa1d85f..1a094ea258 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -5531,9 +5531,6 @@ http://secondlife.com/support 求助解決問題。 <string name="Command_Grid_Status_Label"> 網格狀態 </string> - <string name="Command_HowTo_Label"> - 簡易教學 - </string> <string name="Command_Inventory_Label"> 收納區 </string> @@ -5630,9 +5627,6 @@ http://secondlife.com/support 求助解決問題。 <string name="Command_Grid_Status_Tooltip"> 顯示當前網格狀態 </string> - <string name="Command_HowTo_Tooltip"> - 如何完成常用的動作 - </string> <string name="Command_Inventory_Tooltip"> 察看並使用你擁有的物件 </string> diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt deleted file mode 100644 index 3b3fb1aeb6..0000000000 --- a/indra/newview/tests/gpus_results.txt +++ /dev/null @@ -1,3111 +0,0 @@ -GPU String Supported? Class Stats OpenGL Recognizer ------------------------------------------------------------------------------------------------------- ----------- ----- ----- ------ ------------------------------------ -AMD BARTS (HD 6800) supported 3 1 2.1 AMD BARTS (HD 6800) -AMD CAICOS (HD 6400) supported 3 0 0 AMD CAICOS (HD 6400) -AMD CAYMAN (HD 6900) supported 3 0 0 AMD CAYMAN (HD 6900) -AMD CEDAR (HD 5450) supported 2 0 2.1 AMD CEDAR (HD 5450) -AMD JUNIPER (HD 5700) supported 3 0 0 AMD JUNIPER (HD 5700) -AMD PARK supported 3 0 0 AMD PARK -AMD REDWOOD (HD 5500/5600) supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -AMD RS780 (HD 3200) supported 0 1 2.1 AMD RS780 (HD 3200) -AMD RS880 (HD 4200) supported 0 1 3.2 AMD RS880 (HD 4200) -AMD RV610 (HD 2400) supported 1 0 0 AMD RV610 (HD 2400) -AMD RV620 (HD 3400) supported 1 0 0 AMD RV620 (HD 3400) -AMD RV630 (HD 2600) supported 2 0 0 AMD RV630 (HD 2600) -AMD RV635 (HD 3600) supported 3 0 1.4 AMD RV635 (HD 3600) -AMD RV670 (HD 3800) supported 3 0 0 AMD RV670 (HD 3800) -AMD RV710 (HD 4300) supported 0 1 1.4 AMD RV710 (HD 4300) -AMD RV730 (HD 4600) supported 3 0 1.4 AMD RV730 (HD 4600) -AMD RV770 (HD 4800) supported 3 0 0 AMD RV770 (HD 4800) -AMD RV790 (HD 4800) supported 3 0 0 AMD RV790 (HD 4800) -AMD TURKS (HD 6500/6600) supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI NO MATCH -ATI 760G/Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI ASUS AH24xx supported 1 1 4 ATI Radeon HD 2400 -ATI ASUS AH34xx supported 1 1 4 ATI Radeon HD 3400 -ATI ASUS AH36xx supported 3 1 4 ATI Radeon HD 3600 -ATI ASUS AH46xx supported 3 1 4 ATI Radeon HD 4600 -ATI ASUS AX3xx supported 2 1 4 ATI Radeon HD 4300 -ATI ASUS AX5xx supported 1 1 4 ATI Radeon HD 5xx -ATI ASUS EAH38xx supported 3 1 4 ATI Radeon HD 3800 -ATI ASUS EAH43xx supported 2 1 4 ATI Radeon HD 4300 -ATI ASUS EAH45xx supported 2 1 3.3 ATI Radeon HD 4500 -ATI ASUS EAH48xx supported 3 1 4 ATI Radeon HD 4800 -ATI ASUS EAH54xx supported 3 1 4.2 ATI Radeon HD 5400 -ATI ASUS EAH57xx supported 3 1 4.2 ATI Radeon HD 5700 -ATI ASUS EAH58xx supported 4 1 4.2 ATI Radeon HD 5800 -ATI ASUS EAH64xx supported 3 1 4.2 ATI Radeon HD 6400 -ATI ASUS EAH65xx supported 3 1 4.2 ATI Radeon HD 6500 -ATI ASUS EAH66xx supported 3 1 4.2 ATI Radeon HD 6600 -ATI ASUS EAH67xx supported 3 1 4.2 ATI Radeon HD 6700 -ATI ASUS EAH68xx supported 4 1 4.2 ATI Radeon HD 6800 -ATI ASUS EAH69xx supported 5 1 4.2 ATI Radeon HD 6900 -ATI ASUS EAH6xxx supported 5 1 4.2 ATI Radeon HD 6x00 -ATI ASUS EAH77xx supported 4 1 4.2 ATI Radeon HD 7700 -ATI ASUS HD7700 supported 4 1 4.2 ATI Radeon HD 7700 -ATI ASUS Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx -ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD -ATI All-in-Wonder PCI-E supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Display Adapter supported 1 1 4.1 ATI Display Adapter -ATI FireGL supported 4 1 4.2 ATI FireGL -ATI FireGL 5200 supported 4 1 4.2 ATI FireGL -ATI FireGL 5xxx supported 4 1 4.2 ATI FireGL -ATI FireMV supported 0 1 3.2 ATI FireMV -ATI FirePro 2000 supported 2 1 4.2 ATI FirePro 2000 -ATI FirePro 4000 supported 2 0 4.1 ATI FirePro 4000 -ATI FirePro M supported 3 1 4.2 ATI FirePro M -ATI FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 -ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 -ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 -ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 -ATI Geforce 9500 GT unsupported 0 0 0 ATI GeForce Lulz -ATI Geforce 9600 GT unsupported 0 0 0 ATI GeForce Lulz -ATI Geforce 9800 GT unsupported 0 0 0 ATI GeForce Lulz -ATI IGP 340M unsupported 0 0 1.3 ATI IGP 340M -ATI Mobility Radeon supported 3 0 0 ATI Radeon -ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Mobility Radeon 7xxx supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Mobility Radeon 9600 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Mobility Radeon 9700 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Mobility Radeon 9800 supported 1 0 0 ATI Mobility Radeon 9800 -ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 -ATI Mobility Radeon HD 3400 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3600 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3800 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4300 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Mobility Radeon HD 4500 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Mobility Radeon HD 4600 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Mobility Radeon HD 4800 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5300 supported 3 0 0 ATI Mobility Radeon HD 5300 -ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v -ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v -ATI Mobility Radeon HD 5500 supported 3 0 4.2 ATI Mobility Radeon HD 5500 -ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v -ATI Mobility Radeon HD 5600 supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v -ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v -ATI Mobility Radeon HD 5700 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Mobility Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Mobility Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Mobility Radeon HD 6500M supported 3 1 4.2 ATI Radeon HD 6500 -ATI Mobility Radeon X1xxx supported 2 0 2.1 ATI Mobility Radeon X1000 -ATI Mobility Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx -ATI Mobility Radeon X3xx supported 1 1 2.1 ATI Radeon X300 -ATI Mobility Radeon X6xx supported 1 1 2.1 ATI Radeon X600 -ATI Mobility Radeon X7xx supported 2 1 2.1 ATI Radeon X700 -ATI Mobility Radeon Xxxx supported 2 0 2.1 ATI Mobility Radeon XX000 -ATI R300 (9700) supported 0 1 2.1 ATI R300 (9700) -ATI RV410 (X700) supported 1 0 0 ATI RV410 (X700) -ATI RV530 supported 1 0 0 ATI RV530 -ATI Radeon supported 3 0 0 ATI Radeon -ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 -ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI Radeon 3100 supported 0 1 3.3 ATI Radeon 3100 -ATI Radeon 5xxx supported 3 0 0 ATI Radeon 5xxx -ATI Radeon 7000 supported 0 1 2 ATI Radeon 7xxx -ATI Radeon 7xxx supported 0 1 2 ATI Radeon 7xxx -ATI Radeon 8xxx supported 0 0 0 ATI Radeon 8xxx -ATI Radeon 9000 supported 0 1 1.3 ATI Radeon 9000 -ATI Radeon 9100 supported 0 0 0 ATI Radeon 9100 -ATI Radeon 9200 supported 0 1 1.3 ATI Radeon 9200 -ATI Radeon 9500 supported 0 1 2.1 ATI Radeon 9500 -ATI Radeon 9600 supported 0 1 2.1 ATI Radeon 9600 -ATI Radeon 9700 supported 1 0 0 ATI Radeon 9700 -ATI Radeon 9800 supported 1 1 2.1 ATI Radeon 9800 -ATI Radeon HD 2300 supported 0 1 3.3 ATI Radeon HD 2300 -ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 -ATI Radeon HD 2600 supported 2 1 4 ATI Radeon HD 2600 -ATI Radeon HD 2900 supported 3 1 3.3 ATI Radeon HD 2900 -ATI Radeon HD 3000 supported 0 0 0 ATI Radeon HD 3000 -ATI Radeon HD 3100 supported 1 0 0 ATI Radeon HD 3100 -ATI Radeon HD 3200 supported 1 1 4 ATI Radeon HD 3200 -ATI Radeon HD 3300 supported 1 1 3.3 ATI Radeon HD 3300 -ATI Radeon HD 3400 supported 1 1 4 ATI Radeon HD 3400 -ATI Radeon HD 3500 supported 2 0 0 ATI Radeon HD 3500 -ATI Radeon HD 3600 supported 3 1 4 ATI Radeon HD 3600 -ATI Radeon HD 3700 supported 3 0 3.3 ATI Radeon HD 3700 -ATI Radeon HD 3800 supported 3 1 4 ATI Radeon HD 3800 -ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 -ATI Radeon HD 4300 supported 2 1 4 ATI Radeon HD 4300 -ATI Radeon HD 4400 supported 2 0 0 ATI Radeon HD 4400 -ATI Radeon HD 4500 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Radeon HD 4600 supported 3 1 4 ATI Radeon HD 4600 -ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 -ATI Radeon HD 5400 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Radeon HD 5600 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Radeon HD 5700 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Radeon HD 5800 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Radeon HD 5900 supported 4 1 4.2 ATI Radeon HD 5900 -ATI Radeon HD 6200 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Radeon HD 6300M supported 1 1 4.2 ATI Radeon HD 6300 -ATI Radeon HD 6400 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Radeon HD 64xx supported 3 1 4.2 ATI Radeon HD 6400 -ATI Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Radeon HD 65xx supported 3 1 4.2 ATI Radeon HD 6500 -ATI Radeon HD 6600 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Radeon HD 66xx supported 3 1 4.2 ATI Radeon HD 6600 -ATI Radeon HD 6700 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Radeon HD 6700M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Radeon HD 6800 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Radeon HD 6900 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Radeon HD 7200 supported 2 0 4.2 ATI Radeon HD 7200 -ATI Radeon HD 7300 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Radeon HD 7400 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Radeon HD 7500 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Radeon HD 7600 supported 3 0 4.2 ATI Radeon HD 7600 -ATI Radeon HD 7700 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Radeon HD 7800 supported 5 1 4.2 ATI Radeon HD 7800 -ATI Radeon HD 7900 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Radeon X1000 supported 2 0 2.1 ATI Radeon X1000 -ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 -ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Radeon X13xx supported 2 1 2.1 ATI Radeon X1300 -ATI Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Radeon X1500 supported 2 1 2.1 ATI Radeon X1500 -ATI Radeon X15xx supported 2 1 2.1 ATI Radeon X1500 -ATI Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Radeon X16xx supported 2 1 2.1 ATI Radeon X1600 -ATI Radeon X17xx supported 2 1 2.1 ATI Radeon X1700 -ATI Radeon X1800 supported 3 1 2.1 ATI Radeon X1800 -ATI Radeon X18xx supported 3 1 2.1 ATI Radeon X1800 -ATI Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Radeon X19xx supported 2 1 2.1 ATI Radeon X1900 -ATI Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx -ATI Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx -ATI Radeon X300 supported 1 1 2.1 ATI Radeon X300 -ATI Radeon X500 supported 1 1 2.1 ATI Radeon X500 -ATI Radeon X600 supported 1 1 2.1 ATI Radeon X600 -ATI Radeon X700 supported 2 1 2.1 ATI Radeon X700 -ATI Radeon X800 supported 1 1 2.1 ATI Radeon X800 -ATI Radeon Xpress supported 0 1 2.1 ATI Radeon Xpress -ATI Rage 128 supported 0 0 0 ATI Rage 128 -ATI Technologies NO MATCH -ATI Technologies Inc. NO MATCH -ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. 128MB ATI RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 128MB ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI RADEON X600 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES supported 1 0 2.1 ATI All-in-Wonder 9xxx -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD 760G supported 1 1 3.3 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD FirePro 2270 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. AMD FirePro 2460 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. AMD FirePro M2000 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 -ATI Technologies Inc. AMD FirePro M4000 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M5950 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro V3900 supported 2 0 0 ATI FirePro 3000 -ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 supported 2 0 4.1 ATI FirePro 4000 -ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 supported 3 0 0 ATI FirePro 5000 -ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 supported 3 0 0 ATI FirePro 7000 -ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro W5000 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro W9000 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD RADEON HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD RADEON HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD RADEON HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD RADEON HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD RADEON HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD RADEON HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD RADEON HD6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD RADEON HD6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD RADEON HD6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon supported 3 0 0 ATI Radeon -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 0 0 ATI Radeon 6xxx -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) supported 0 0 0 ATI Radeon 6xxx -ATI Technologies Inc. AMD Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. AMD Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250M supported 3 0 4.2 ATI Radeon HD 6200D/G/M -ATI Technologies Inc. AMD Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6290M supported 3 0 4.2 ATI Radeon HD 6200D/G/M -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6310 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6320 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphic supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6330M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6370D supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6370M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6400 Series supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6410D supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450 Graphics supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450A Graphics supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6480M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6490M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6500 series graphics supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6500M Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6510 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530D supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550A supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6550D supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570M/5730 supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6600M Series supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6610M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6625M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6650A Graphics supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6700 series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6700M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6730M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6750 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6750M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6770M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800M Series supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6850 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850 X2 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850M supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6870 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6870M supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6900 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6900M Series supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 6970 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6970M supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 6990 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6990M supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 7000 series supported 3 1 4.2 ATI Radeon HD 7000 Series -ATI Technologies Inc. AMD Radeon HD 7290 Graphics supported 2 0 4.2 ATI Radeon HD 7200 -ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310G supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7310M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7340 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7340 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7340G supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7340M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7350 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7370M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7400 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7400G supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7410M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7420G supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450 Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7470 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7470 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7470M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7480D supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7500 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500/7600 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500G supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7510 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7520G supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7540D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7550M supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7570 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570 Graphics supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570M supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7580D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7600G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7620G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7650A supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7650M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7650M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7670 supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7690M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7700 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7700M Series supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. AMD Radeon HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. AMD Radeon HD 7770 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7800 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800M Series supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD 7870 supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7870M supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD 7900 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7950 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7970 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7970M supported 4 0 4.2 ATI Radeon HD 7900D/G/M -ATI Technologies Inc. AMD Radeon HD 8210 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8240 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8250 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8280G supported 3 0 4.2 ATI Radeon HD 8200D/G/M -ATI Technologies Inc. AMD Radeon HD 8330 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon HD 8350G supported 3 0 4.2 ATI Radeon HD 8300D/G/M -ATI Technologies Inc. AMD Radeon HD 8400 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8450 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8450G supported 4 0 4.2 ATI Radeon HD 8400D/G/M -ATI Technologies Inc. AMD Radeon HD 8470 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8470D supported 4 0 4.2 ATI Radeon HD 8400D/G/M -ATI Technologies Inc. AMD Radeon HD 8550G supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon HD 8570 supported 3 1 4.2 ATI Radeon HD 8500 (OEM) -ATI Technologies Inc. AMD Radeon HD 8570D supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon HD 8610G supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8650G supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8670D supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8700M Series supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8730M supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8750M supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8760 supported 4 1 4.2 ATI Radeon HD 8700 (OEM) -ATI Technologies Inc. AMD Radeon HD 8800M Series supported 4 0 4.2 ATI Radeon HD 8800D/G/M -ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) supported 5 1 4.2 ATI Radeon HD 8900 (OEM) -ATI Technologies Inc. AMD Radeon HD 8950 supported 5 1 4.2 ATI Radeon HD 8900 (OEM) -ATI Technologies Inc. AMD Radeon HD HD7850M supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD7700 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD7770 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon(TM) HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon(TM) HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon(TM) HD8490 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon. HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon. HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon. HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. ASUS AH3450 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ASUS AH3650 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ASUS AH4650 Series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS ARES unsupported 0 0 0 ATI ARES -ATI Technologies Inc. ASUS ARES2 unsupported 0 0 0 ATI ARES -ATI Technologies Inc. ASUS EAH2400 Series supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ASUS EAH2600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ASUS EAH3450 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ASUS EAH3650 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ASUS EAH3850 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ASUS EAH3870 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ASUS EAH4350 series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS EAH4550 series supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ASUS EAH4650 series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS EAH4670 series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS EAH4770 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ASUS EAH4770 series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ASUS EAH4850 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4870 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4870x2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4890 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH5450 Series supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ASUS EAH5550 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS EAH5570 series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS EAH5670 Series supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ASUS EAH5750 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ASUS EAH5770 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ASUS EAH5830 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH5850 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH5870 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH6450 Series supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ASUS EAH6570 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ASUS EAH6670 Series supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. ASUS EAH6750 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ASUS EAH6770 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ASUS EAH6850 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. ASUS EAH6870 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. ASUS EAH6950 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ASUS EAH6970 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ASUS Extreme AX300 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS Extreme AX300SE/T supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS Extreme AX550 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS Extreme AX600 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ASUS HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. ASUS HD7470 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. ASUS HD7670 Series supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. ASUS HD7750 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7770 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7790 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7850 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. ASUS HD7870 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. ASUS HD7950 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ASUS HD7970 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ASUS X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1600 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon HD 5000 Series supported 3 1 4.2 ATI Radeon HD 5000 -ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD -ATI Technologies Inc. ATI Display Adapter supported 1 1 4.1 ATI Display Adapter -ATI Technologies Inc. ATI FireGL V3100 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3300 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3350 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3600 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI FireGL V5600 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI FireGL V7200 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7600 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7700 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireMV 2250 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. ATI FirePro 2260 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro 2450 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 -ATI Technologies Inc. ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 supported 2 0 0 ATI FirePro 3000 -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V4800 supported 2 0 4.1 ATI FirePro 4000 -ATI Technologies Inc. ATI FirePro V4800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V7800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V7800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V8700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V9800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FireGL V3200 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI MOBILITY FireGL V5200 supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5250 supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI MOBILITY RADEON X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1350 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X1700 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI MOBILITY RADEON X1800 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. ATI MOBILITY RADEON X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI MOBILITY RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility FireGL V5700 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility FireGL V5725 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH -ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 3850 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5570 supported 3 0 4.2 ATI Mobility Radeon HD 5500 -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Mobility Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1350 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1700 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. ATI Mobility Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Mobility Radeon X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2500 supported 2 0 2.1 ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI RADEON 9600 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI RADEON 9600/X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI RADEON E4690 supported 3 1 4 ATI RADEON E4690 -ATI Technologies Inc. ATI RADEON HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Series Graphics supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3100 Graphics supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 3100 Series Graphics supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 9550 / X1050 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 3 1 2.1 AMD BA (HD 6800) -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) -ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) -ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 0 2.1 AMD CEDAR (HD 5450) -ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH -ATI Technologies Inc. ATI Radeon HD 2350 supported 0 1 3.3 ATI Radeon HD 2300 -ATI Technologies Inc. ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Series AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Series AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600/3600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 2900 PRO supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 1 3.3 ATI Radeon HD 3300 -ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 AGP supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4270 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4290 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4300 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4450 supported 2 0 0 ATI Radeon HD 4400 -ATI Technologies Inc. ATI Radeon HD 4500 Series supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4520 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4550 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4580 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4590 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4650 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4720 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4770 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4810 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4830 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 X2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5470 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5530 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5570 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5630 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5900 Series supported 4 1 4.2 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 5970 supported 4 1 4.2 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 6230 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6390 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6490 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ATI Radeon HD 6510 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6570M supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ATI Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine supported 3 0 2.1 AMD PITCAIRN (HD 7870) -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine supported 3 0 2.1 AMD TAHITI (HD 7000) -ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine unsupported 0 0 0 ATI Radeon VE -ATI Technologies Inc. ATI Radeon HD3750 supported 3 0 3.3 ATI Radeon HD 3700 -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD4650 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD4670 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 0 1.4 AMD RV730 (HD 4600) -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 0 0 AMD RV790 (HD 4800) -ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI Technologies Inc. ATI Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 Series supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1250 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1270 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Technologies Inc. Diamond Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireGL X1-128 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics supported 2 0 4.1 ATI FirePro M3900 -ATI Technologies Inc. GIGABYTE RADEON 9600 PRO supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. GIGABYTE Radeon X1300 Pro supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. GIGABYTE Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. GIGABYTE Radeon X1600 PRO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. GeCube RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. GeCube RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. GeCube Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. GeCube Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 unsupported 0 0 0 ATI GeForce Lulz -ATI Technologies Inc. GigaByte Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Gigabyte RADEON X300 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Gigabyte RADEON X300 SE supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. HD3730 supported 3 0 3.3 ATI HD3700 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. HIGHTECH RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. M52 x86 supported 1 0 0 ATI M52 -ATI Technologies Inc. M72-M supported 1 0 0 ATI M72 -ATI Technologies Inc. MEDION RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MOBILITY RADEON 9600 x86 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9700 x86 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 supported 1 0 0 ATI Mobility Radeon 9800 -ATI Technologies Inc. MOBILITY RADEON X300 x86 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X600 x86 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE supported 1 0 0 ATI Radeon RX9550 -ATI Technologies Inc. MSI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Mobility Radeon X2300 HD supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 SDR x86 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 8xxx -ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 supported 0 0 0 ATI Radeon 8xxx -ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 IGP DDR x86 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9500 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9500 PRO / 9700 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9600 SERIES supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 XT x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600SE x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9700 PRO supported 1 0 0 ATI Radeon 9700 -ATI Technologies Inc. RADEON 9800 PRO supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 PRO - Secondary supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 SERIES supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 XT supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 0 1.3 ATI IGP 340M -ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. RADEON X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550XT supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 PRO x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series Secondary supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 PRO/GTO supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XL x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800/X850 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800GT supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ROBSON CE supported 3 0 4 ATI ROBSON -ATI Technologies Inc. ROBSON LE supported 3 0 4 ATI ROBSON -ATI Technologies Inc. RS780M supported 0 1 2.1 AMD RS780 (HD 3200) -ATI Technologies Inc. RS880 supported 0 1 3.2 AMD RS880 (HD 4200) -ATI Technologies Inc. RV250 DDR x86/SSE2 supported 0 0 0 ATI Radeon RV250 -ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 6370M supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. Radeon (TM) HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon (TM) HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon (TM) HD 6630M supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. Radeon (TM) HD 6750M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. Radeon (TM) HD 6770M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. Radeon (TM) HD 6850M supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. Radeon (TM) HD 7450M supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. Radeon (TM) HD 7470M supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 7690M XT supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 7750M supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. Radeon (TM) HD 7850M supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. Radeon (TM) HD 8750M supported 4 1 4.2 ATI Radeon HD 8700 (OEM) -ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7500 DDR x86 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. Radeon HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1600 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 GTO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 SE supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1700 FSC supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. Radeon X1800 CrossFire Edition supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1800 Series supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1900 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 GT supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X550/X700 Series supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. Radeon X550XTX supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SUMO 9640 supported 3 1 4.1 AMD SUMO -ATI Technologies Inc. SUMO 964A supported 3 1 4.1 AMD SUMO -ATI Technologies Inc. Sapphire RADEON X1600 PRO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Sapphire RADEON X1600 XT supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Tul Corporation, RADEON X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Tul Corporation, RADEON X300SE supported 1 1 2.1 ATI RADEON X300SE -ATI Technologies Inc. VisionTek Radeon 4350 supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. VisionTek Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. VisionTek Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 XGE supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. WRESTLER 9802 supported 3 1 4 AMD WRESTLER -ATI Technologies Inc. XFX Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 1 3.2 AMD RS880 (HD 4200) -Alex Mohr GL Hijacker! unsupported 0 0 0 Hijacker -Brian Paul Mesa X11 unsupported 1 1 3 Mesa -Gallium supported 1 1 2.1 Gallium -Humper supported 0 1 2.1 Humper -Humper Chromium supported 0 1 2.1 Humper -Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze -Imagination Technologies PowerVR SGX545 supported 1 1 3 PowerVR SGX545 -Intel NO MATCH -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com supported 2 0 0 Intel 3D-Analyze -Intel 4 Series Internal supported 1 1 2.1 Intel 4 Series Internal -Intel 845G unsupported 0 1 1.4 Intel 845G -Intel 855GM unsupported 0 1 1.4 Intel 855GM -Intel 865G unsupported 0 1 1.4 Intel 865G -Intel 915G unsupported 0 1 1.4 Intel 915G -Intel 915GM unsupported 0 1 1.4 Intel 915GM -Intel 945G supported 0 1 1.4 Intel 945G -Intel 945GM supported 0 1 1.4 Intel 945GM -Intel 950 supported 0 1 1.4 Intel 950 -Intel 965 supported 0 1 2.1 Intel 965 -Intel Bear Lake unsupported 1 1 1.4 Intel Bear Lake -Intel Broadwater unsupported 0 1 1.4 Intel Broadwater -Intel Brookdale unsupported 0 1 1.3 Intel Brookdale -Intel Cantiga unsupported 0 1 2 Intel Cantiga -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series supported 0 1 3 Intel GMA 3600 -Intel Eaglelake supported 1 1 2 Intel Eaglelake -Intel G33 unsupported 1 1 1.4 Intel G33 -Intel G41 supported 1 1 2.1 Intel G41 -Intel G45 supported 1 1 2.1 Intel G45 -Intel Graphics Media HD supported 1 1 2.1 Intel Graphics Media HD -Intel HD Graphics supported 2 1 4 Intel HD Graphics -Intel HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 -Intel HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 -Intel HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 -Intel Inc. Intel GMA 950 OpenGL Engine supported 0 1 1.4 Intel 950 -Intel Inc. Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 -Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 -Intel Inc. Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 -Intel Inc. Intel HD Graphics 5000 OpenGL Engine supported 4 0 4 Intel HD Graphics 5000 -Intel Inc. Intel HD Graphics OpenGL Engine supported 2 1 4 Intel HD Graphics -Intel Intel 845G unsupported 0 1 1.4 Intel 845G -Intel Intel 855GM unsupported 0 1 1.4 Intel 855GM -Intel Intel 865G unsupported 0 1 1.4 Intel 865G -Intel Intel 915G unsupported 0 1 1.4 Intel 915G -Intel Intel 915GM unsupported 0 1 1.4 Intel 915GM -Intel Intel 945G supported 0 1 1.4 Intel 945G -Intel Intel 945GM supported 0 1 1.4 Intel 945GM -Intel Intel 965/963 Graphics Media Accelerator supported 0 1 2.1 Intel 965 -Intel Intel Bear Lake B unsupported 1 1 1.4 Intel Bear Lake -Intel Intel Broadwater G unsupported 0 1 1.4 Intel Broadwater -Intel Intel Brookdale-G unsupported 0 1 1.3 Intel Brookdale -Intel Intel Cantiga unsupported 0 1 2 Intel Cantiga -Intel Intel Eaglelake supported 1 1 2 Intel Eaglelake -Intel Intel Grantsdale-G supported 1 0 0 Intel Grantsdale -Intel Intel Iris Pro Graphics 5200 supported 4 0 4 Intel Intel Iris Pro Graphics 5200 -Intel Intel Montara-GM unsupported 0 1 1.3 Intel Montara -Intel Intel Pineview Platform supported 0 1 1.4 Intel Pineview -Intel Intel Springdale-G unsupported 0 1 1.3 Intel Springdale -Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics -Intel Intel(R) 4 Series Internal Chipset supported 1 1 2.1 Intel 4 Series Internal -Intel Intel(R) B43 Express Chipset supported 1 1 2.1 Intel B45/B43 -Intel Intel(R) G41 Express Chipset supported 1 1 2.1 Intel G41 -Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) supported 1 1 2.1 Intel G41 -Intel Intel(R) G41 Express Chipset v2 supported 1 1 2.1 Intel G41 -Intel Intel(R) G45/G43 Express Chipset supported 1 1 2.1 Intel G45 -Intel Intel(R) G45/G43/G41 Express Chipset supported 1 1 2.1 Intel G41 -Intel Intel(R) Graphics Media Accelerator HD supported 1 1 2.1 Intel Graphics Media HD -Intel Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics 100 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 -Intel Intel(R) HD Graphics 2500 supported 2 0 4.2 Intel HD Graphics 2500 -Intel Intel(R) HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 -Intel Intel(R) HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 -Intel Intel(R) HD Graphics 4400 supported 3 0 4.2 Intel HD Graphics 4400 -Intel Intel(R) HD Graphics 4600 supported 3 0 4.2 Intel HD Graphics 4600 -Intel Intel(R) HD Graphics 5000 supported 4 0 4 Intel HD Graphics 5000 -Intel Intel(R) HD Graphics BR-1004-01Y1 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics P3000 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics P4000 supported 2 1 4 Intel HD Graphics -Intel Intel(R) Q45/Q43 Express Chipset supported 1 1 2.1 Intel Q45/Q43 -Intel Iris OpenGL Graphics Engine supported 4 0 4 Intel Intel Iris OpenGL Engine -Intel Mobile 4 Series supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family v2 supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) supported 0 0 2.1 Intel Mobile 45 Express -Intel Mobile Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics -Intel Montara unsupported 0 1 1.3 Intel Montara -Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM -Intel Open Source Technology Center Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945G supported 0 1 1.4 Intel 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 supported 1 1 2.1 Intel G45 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 supported 1 1 2.1 Intel G45 -Intel Open Source Technology Center Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Pineview supported 0 1 1.4 Intel Pineview -Intel Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 -Intel Royal BNA Driver unsupported 0 0 0 Intel Royal BNA -Intel Springdale unsupported 0 1 1.3 Intel Springdale -Intel X3100 supported 1 1 2.1 Intel X3100 -Matrox Graphics Inc. Matrox ICD for M-Series unsupported 0 0 0 Matrox -Matrox Graphics Inc. Matrox G400 unsupported 0 0 0 Matrox -Matrox Graphics Inc. Matrox ICD for Parhelia unsupported 0 0 0 Matrox -Mesa unsupported 1 1 3 Mesa -Mesa Project Software Rasterizer unsupported 1 1 3 Mesa -Mesa project: www.mesa3d.org Mesa GLX Indirect unsupported 1 1 3 Mesa -NVIDIA 205 supported 3 1 3.3 NVIDIA 205 -NVIDIA 210 supported 3 1 3.3 NVIDIA 210 -NVIDIA 310 supported 3 1 3.3 NVIDIA 310 -NVIDIA 310M supported 2 0 3.3 NVIDIA 310M -NVIDIA 315 supported 3 1 3.3 NVIDIA 315 -NVIDIA 315M supported 2 0 3.3 NVIDIA 310M -NVIDIA 320M supported 2 0 3.3 NVIDIA 320M -NVIDIA 405 supported 3 0 3.3 NVIDIA 405 -NVIDIA 410 supported 3 0 3.3 NVIDIA 410 -NVIDIA 510 supported 3 0 0 NVIDIA 510 -NVIDIA 610M supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation /PCI/SSE2 NO MATCH -NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze -NVIDIA Corporation C51/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 -NVIDIA Corporation C51G/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 -NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! unsupported 0 0 0 NVIDIA D1xP1 -NVIDIA Corporation D14P1-30/PCIe/SSE2 unsupported 0 0 0 NVIDIA D1xP1 -NVIDIA Corporation D9M-20/PCI/SSE2 supported 1 0 0 NVIDIA D9M -NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA D9M -NVIDIA Corporation G72/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G72 -NVIDIA Corporation G73/AGP/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 -NVIDIA Corporation G73/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 -NVIDIA Corporation G84-50/PCI/SSE2 supported 2 0 0 NVIDIA G84 -NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! supported 3 0 0 NVIDIA G92 -NVIDIA Corporation GK106/PCIe/SSE2 supported 5 0 4.3 NVIDIA GK106 -NVIDIA Corporation GRID K2/PCIe/SSE2 unsupported 0 0 1.5 NVIDIA GRID -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce 205/PCI/SSE2 supported 3 1 3.3 NVIDIA 205 -NVIDIA Corporation GeForce 210/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 310/PCI/SSE2 supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCIe/SSE2 supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 310M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 315/PCI/SSE2 supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCIe/SSE2 supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 315M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 320M/PCI/SSE2 supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation GeForce 320M/integrated/SSE2 supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation GeForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCIe/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 410M/PCI/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce 410M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce 505/PCIe/SSE2 supported 3 0 0 NVIDIA 505 -NVIDIA Corporation GeForce 510/PCI/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce 510/PCIe/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce 605/PCI/SSE2 supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 605/PCIe/SSE2 supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 610/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 610M/PCIe/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 615/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6500/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 710A/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 supported 3 0 4.3 NVIDIA 710M -NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 9100/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M G/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 S/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce FX 5100/AGP/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5600/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 -NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 -NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA Corporation GeForce G 103M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 110M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 110M -NVIDIA Corporation GeForce G100/PCI/SSE2 supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCIe/SSE2 supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G102M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G102M/integrated/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G200/PCI/SSE2 supported 2 1 3.3 NVIDIA G200 -NVIDIA Corporation GeForce G200/integrated/SSE2 supported 2 1 3.3 NVIDIA G200 -NVIDIA Corporation GeForce G205M/PCI/SSE2 supported 1 0 0 NVIDIA G 200M -NVIDIA Corporation GeForce G205M/integrated/SSE2 supported 1 0 0 NVIDIA G 200M -NVIDIA Corporation GeForce G210/PCI/SSE2 supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCIe/SSE2 supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210M/PCI/SSE2 supported 3 0 3.3 NVIDIA G210M -NVIDIA Corporation GeForce G210M/PCIe/SSE2 supported 3 0 3.3 NVIDIA G210M -NVIDIA Corporation GeForce GT 120/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 130/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 130M -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 130M -NVIDIA Corporation GeForce GT 140/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA Corporation GeForce GT 140/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 220M -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 220M -NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 230M -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 230M -NVIDIA Corporation GeForce GT 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 320/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 325M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 330/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 335M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 340/PCI/SSE2 supported 3 0 0 NVIDIA GT 340 -NVIDIA Corporation GeForce GT 340/PCIe/SSE2 supported 3 0 0 NVIDIA GT 340 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 415 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 415 -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce GT 420/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 430/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 435M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430M -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430M -NVIDIA Corporation GeForce GT 440/PCI/SSE2 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 440M -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 440M -NVIDIA Corporation GeForce GT 520/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 530/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540M -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540M -NVIDIA Corporation GeForce GT 545/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 555M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 61x -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 61x -NVIDIA Corporation GeForce GT 620/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 625/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation GeForce GT 630M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 635M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 650M -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 720M -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 740M -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 750M -NVIDIA Corporation GeForce GT620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GTS 150/PCI/SSE2 supported 2 0 0 NVIDIA GTS 150 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 supported 2 0 0 NVIDIA GTS 160M -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 supported 2 0 0 NVIDIA GTS 160M -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTS 250M -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTS 250M -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA Corporation GeForce GTS 450/PCI/SSE2 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 260M -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 260M -NVIDIA Corporation GeForce GTX 275/PCI/SSE2 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 280/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 470M -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 560M -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GTX 560M -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 supported 5 0 4.3 NVIDIA GTX 570M -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 570M -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 64x -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 660M -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 69x -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 76x -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 770M -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 78x -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 780M -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce Go 6100/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA Corporation GeForce Go 6400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA Corporation GeForce Go 6600/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 6800/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2 supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7700/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 7700 -NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Corporation GeForce2 GTS/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce3/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation ION LE/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION LE/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCIe/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA MCP61 -NVIDIA Corporation MCP7A-O/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A -NVIDIA Corporation MCP7A-P/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A -NVIDIA Corporation N10P-GV2/PCI/SSE2 supported 1 0 2.1 NVIDIA N10 -NVIDIA Corporation N11M-GE2/PCI/SSE2 supported 2 0 3.1 NVIDIA Corporation N11M -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 supported 1 1 4.1 NVIDIA Corporation N12P -NVIDIA Corporation NB9M-GE1/PCI/SSE2 supported 1 0 0 NVIDIA NB9M -NVIDIA Corporation NB9M-GS/PCI/SSE2 supported 1 0 0 NVIDIA NB9M -NVIDIA Corporation NV17/AGP/SSE2 supported 0 0 0 NVIDIA NV17 -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 660M -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 770M -NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 780M -NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine supported 0 0 0 NVIDIA NV34 -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation NVS 2100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M -NVIDIA Corporation NVS 2100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M -NVIDIA Corporation NVS 300/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 300/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 310/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 3100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M -NVIDIA Corporation NVS 3100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M -NVIDIA Corporation NVS 315/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 4200M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Corporation NVS 4200M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Corporation NVS 510/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 5100M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M -NVIDIA Corporation NVS 5100M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M -NVIDIA Corporation NVS 5200M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M -NVIDIA Corporation NVS 5200M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M -NVIDIA Corporation NVS 5400M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5400M -NVIDIA Corporation Quadro 1000M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro 1100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 1100M -NVIDIA Corporation Quadro 2000 D/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 3000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro 400/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 400/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 4000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro 4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro 410/PCIe/SSE2 supported 3 0 3.3 NVIDIA 410 -NVIDIA Corporation Quadro 5000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5010M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 600/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 6000/PCIe/SSE2 supported 3 0 0 NVIDIA Quadro 6000 -NVIDIA Corporation Quadro FX 1000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1100/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1300/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 supported 1 0 2.1 NVIDIA Quadro FX 1500M -NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M -NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M -NVIDIA Corporation Quadro FX 1700/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 2000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Corporation Quadro FX 3000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3500/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 350M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 -NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 -NVIDIA Corporation Quadro FX 360M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3700/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 370M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3800/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 380M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 4500/PCI/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 4800/PCI/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation Quadro FX 500/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 540/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 540/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 550/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 550/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 560/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 560/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 580/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 580/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 770M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation Quadro FX 880M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX Go700/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro K1000/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K1000 -NVIDIA Corporation Quadro K1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro K2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro K4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro K4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro K5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro K5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro K600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 285/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 295/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 300M -NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M -NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M -NVIDIA Corporation Quadro NVS 420/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH -NVIDIA Corporation Quadro2 MXR/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro2 -NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation RIVA TNT2/AGP/SSE2 unsupported 0 0 1.5 NVIDIA RIVA TNT -NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! unsupported 0 0 1.5 NVIDIA RIVA TNT -NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation nForce 750a SLI/PCI/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 750a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 760i SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation unknown board/AGP/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCI/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCIe/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA D9M supported 1 0 0 NVIDIA D9M -NVIDIA G 103M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G 105M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G 110M supported 1 1 3.3 NVIDIA G 110M -NVIDIA G 120M supported 1 1 3.3 NVIDIA G 120M -NVIDIA G 200 supported 2 1 3.3 NVIDIA G200 -NVIDIA G 205M supported 1 0 0 NVIDIA G 200M -NVIDIA G 210 supported 3 1 3.3 NVIDIA G210 -NVIDIA G 310M supported 2 0 3.3 NVIDIA G 310M -NVIDIA G 320M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA G 405 supported 3 0 3.3 NVIDIA 405 -NVIDIA G 410M supported 3 1 4.2 NVIDIA G 410M -NVIDIA G 610M supported 3 1 4.3 NVIDIA 610M -NVIDIA G100 supported 3 1 4.2 NVIDIA G100 -NVIDIA G100M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G102M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G103M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G105M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G200 supported 2 1 3.3 NVIDIA G200 -NVIDIA G210 supported 3 1 3.3 NVIDIA G210 -NVIDIA G210M supported 3 0 3.3 NVIDIA G210M -NVIDIA G73 supported 1 0 0 NVIDIA G73 -NVIDIA G84 supported 2 0 0 NVIDIA G84 -NVIDIA G92 supported 3 0 0 NVIDIA G92 -NVIDIA G94 supported 3 0 0 NVIDIA G94 -NVIDIA GT 120 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA GT 120M supported 2 0 3.3 NVIDIA GT 120 -NVIDIA GT 130 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA GT 130M supported 3 1 3.3 NVIDIA GT 130M -NVIDIA GT 140 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA GT 140M supported 3 1 3.3 NVIDIA GT 140M -NVIDIA GT 150 supported 2 1 3.3 NVIDIA GT 150 -NVIDIA GT 220 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA GT 220M supported 3 1 3.3 NVIDIA GT 220M -NVIDIA GT 230 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA GT 230M supported 3 1 3.3 NVIDIA GT 230M -NVIDIA GT 240 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA GT 240M supported 3 1 3.3 NVIDIA GT 240M -NVIDIA GT 260M supported 3 1 3.3 NVIDIA GT 260M -NVIDIA GT 320 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA GT 320M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA GT 325M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA GT 330 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA GT 330M supported 3 1 3.3 NVIDIA GT 330M -NVIDIA GT 335M supported 3 1 3.3 NVIDIA GT 330M -NVIDIA GT 340 supported 3 0 0 NVIDIA GT 340 -NVIDIA GT 340M supported 4 1 3.3 NVIDIA GT 340M -NVIDIA GT 415M supported 3 0 0 NVIDIA 410M -NVIDIA GT 420 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA GT 420M supported 3 1 4.3 NVIDIA GT 420M -NVIDIA GT 425M supported 3 1 4.3 NVIDIA GT 420M -NVIDIA GT 430 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA GT 430M supported 3 1 4.3 NVIDIA GT 430M -NVIDIA GT 435M supported 3 1 4.3 NVIDIA GT 430M -NVIDIA GT 440 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA GT 440M supported 3 1 4.3 NVIDIA GT 440M -NVIDIA GT 445M supported 3 1 4.3 NVIDIA GT 440M -NVIDIA GT 450 supported 4 1 4.3 NVIDIA GT 450 -NVIDIA GT 520 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA GT 520M supported 3 1 4.3 NVIDIA GT 520M -NVIDIA GT 525M supported 3 1 4.3 NVIDIA GT 520M -NVIDIA GT 530M supported 3 1 4.3 NVIDIA GT 530M -NVIDIA GT 540 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA GT 540M supported 3 1 4.3 NVIDIA GT 540M -NVIDIA GT 550 supported 3 1 4.3 NVIDIA GT 550 -NVIDIA GT 550M supported 3 1 4.3 NVIDIA GT 550M -NVIDIA GT 555M supported 3 1 4.3 NVIDIA GT 550M -NVIDIA GT 610 supported 3 1 4.3 NVIDIA GT 61x -NVIDIA GT 620 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA GT 620M supported 3 0 4.3 NVIDIA GT 620M -NVIDIA GT 630 supported 3 0 4.3 NVIDIA GT 63x -NVIDIA GT 630M supported 3 0 4.3 NVIDIA GT 630M -NVIDIA GT 635M supported 3 0 4.3 NVIDIA GT 630M -NVIDIA GT 640 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA GT 640M supported 3 0 4.3 NVIDIA GT 640M -NVIDIA GT 650 supported 3 1 4.3 NVIDIA GT 65x -NVIDIA GT 650M supported 3 0 4.3 NVIDIA GT 650M -NVIDIA GTS 160M supported 2 0 0 NVIDIA GTS 160M -NVIDIA GTS 240 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA GTS 250 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA GTS 350M supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA GTS 360 supported 4 1 3.3 NVIDIA GTS 360 -NVIDIA GTS 360M supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA GTS 450 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA GTX 260 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA GTX 270 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA GTX 275 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA GTX 280 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA GTX 285 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA GTX 290 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA GTX 295 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA GTX 460 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA GTX 460M supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA GTX 465 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA GTX 470 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA GTX 470M supported 3 0 4.3 NVIDIA GTX 470M -NVIDIA GTX 480 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA GTX 480M supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA GTX 485M supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA GTX 550 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA GTX 560 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA GTX 560 Ti supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA GTX 570 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA GTX 580 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA GTX 580M supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA GTX 590 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA GTX 650 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA GTX 660 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA GTX 670 supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA GTX 670M supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA GTX 675M supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA GTX 680 supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA GTX 680M supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA GTX 690 supported 5 1 4.3 NVIDIA GTX 69x -NVIDIA GTX 770 supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA GTX TITAN supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA GeForce 2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA GeForce 3 supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA GeForce 4 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 Go supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 MX supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 Ti supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 6100 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA GeForce 6200 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA GeForce 6500 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA GeForce 6600 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA GeForce 6700 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA GeForce 6800 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA GeForce 7000 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA GeForce 7000M supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA GeForce 7100 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA GeForce 7300 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA GeForce 7500 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA GeForce 7600 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA GeForce 7800 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA GeForce 7900 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA GeForce 8100 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA GeForce 8200 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA GeForce 8200M supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA GeForce 8300 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA GeForce 8400 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA GeForce 8400M supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA GeForce 8500 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA GeForce 8600 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600M supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA GeForce 8700 supported 3 0 0 NVIDIA GeForce 8700 -NVIDIA GeForce 8700M supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA GeForce 8800 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800M supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA GeForce 9100 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA GeForce 9100M supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA GeForce 9200 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA GeForce 9200M supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA GeForce 9300 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA GeForce 9300M supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA GeForce 9400 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA GeForce 9400M supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA GeForce 9500 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA GeForce 9500M supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA GeForce 9600 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA GeForce 9600M supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA GeForce 9700M supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA GeForce 9800 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800M supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA GeForce FX 5200 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5500 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5600 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5700 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5900 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100 supported 3 0 0 NVIDIA 510 -NVIDIA GeForce FX Go5200 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5600 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5700 supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA GeForce Go 6 supported 1 0 0 NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200 supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6400 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6600 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6800 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200 supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7300 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7400 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7600 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7700 supported 0 1 2.1 NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7800 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7900 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA GeForce PCX supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Generic unsupported 0 0 2.1 NVIDIA Generic -NVIDIA ION supported 2 1 3.3 NVIDIA ION a -NVIDIA MCP61 supported 1 0 2.1 NVIDIA MCP61 -NVIDIA NV34 supported 0 0 0 NVIDIA NV34 -NVIDIA PCI unsupported 0 0 2.1 NVIDIA PCI -NVIDIA Quadro 2000 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Quadro 2000 M/D supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Quadro 3000M supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Quadro 400 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Quadro 4000 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Quadro 4000M supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Quadro 50x0 M supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Quadro 600 supported 2 0 4.2 NVIDIA Quadro 600 -NVIDIA Quadro 6000 supported 3 0 0 NVIDIA Quadro 6000 -NVIDIA Quadro FX supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 1500M supported 1 0 2.1 NVIDIA Quadro FX 1500M -NVIDIA Quadro FX 1800 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 2500M supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Quadro FX 2700M supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Quadro FX 2800M supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Quadro FX 3500 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3700 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3800 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 4500 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4800 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 550 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 770M supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Quadro FX 880M supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Quadro NVS supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Quadro NVS 1xxM supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Quadro NVS 4200M supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Quadro2 supported 0 0 1.5 NVIDIA Quadro2 -NVIDIA nForce unsupported 0 0 3.3 NVIDIA nForce -Oracle VirtualBox Graphics supported 0 1 2.1 Oracle -Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 -Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M -PowerVR SGX545 supported 1 1 3 PowerVR SGX545 -S3 unsupported 0 1 1.4 S3 -S3 Graphics K8M800/MMX/K3D unsupported 0 1 1.4 S3 -S3 Graphics KM400/KN400/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics P8M800/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics Unknown Device/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated ProSavage/Twister unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HC3 IGP unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP unsupported 0 1 1.4 S3 -SiS unsupported 0 1 1.5 SiS -SiS 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 1 1.5 SiS -SiS 650/M650 VGA unsupported 0 1 1.5 SiS -SiS 650/M650 VGA / MMX/SSE2 /AGP unsupported 0 1 1.5 SiS -SiS 661 VGA unsupported 0 1 1.5 SiS -SiS 662 VGA unsupported 0 1 1.5 SiS -SiS 760 VGA unsupported 0 1 1.5 SiS -SiS 761GX VGA unsupported 0 1 1.5 SiS -SiS Mirage Graphics3 unsupported 0 1 1.4 S3 -SiS Xabre VGA unsupported 0 1 1.5 SiS -Tungsten Graphics, Inc Mesa DRI Intel(R) 845G unsupported 0 1 1.4 Intel 845G -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM unsupported 0 1 1.4 Intel 855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G unsupported 0 1 1.4 Intel 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD ARUBA supported 3 1 2.1 AMD ARUBA (HD 6800) -X.Org Gallium 0.4 on AMD BARTS supported 3 1 2.1 AMD BARTS (HD 6800) -X.Org Gallium 0.4 on AMD CAICOS supported 3 0 0 AMD CAICOS (HD 6400) -X.Org Gallium 0.4 on AMD CAPE VERDE supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD CEDAR supported 2 0 2.1 AMD CEDAR (HD 5450) -X.Org Gallium 0.4 on AMD CYPRESS supported 3 0 0 AMD CYPRESS (HD 5800) -X.Org Gallium 0.4 on AMD JUNIPER supported 3 0 0 AMD JUNIPER (HD 5700) -X.Org Gallium 0.4 on AMD PALM supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD REDWOOD supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -X.Org Gallium 0.4 on AMD RS780 supported 0 1 2.1 AMD RS780 (HD 3200) -X.Org Gallium 0.4 on AMD RS880 supported 0 1 3.2 AMD RS880 (HD 4200) -X.Org Gallium 0.4 on AMD RV610 supported 1 0 0 AMD RV610 (HD 2400) -X.Org Gallium 0.4 on AMD RV620 supported 1 0 0 AMD RV620 (HD 3400) -X.Org Gallium 0.4 on AMD RV630 supported 2 0 0 AMD RV630 (HD 2600) -X.Org Gallium 0.4 on AMD RV635 supported 3 0 1.4 AMD RV635 (HD 3600) -X.Org Gallium 0.4 on AMD RV670 supported 3 0 0 AMD RV670 (HD 3800) -X.Org Gallium 0.4 on AMD RV710 supported 0 1 1.4 AMD RV710 (HD 4300) -X.Org Gallium 0.4 on AMD RV730 supported 3 0 1.4 AMD RV730 (HD 4600) -X.Org Gallium 0.4 on AMD RV740 supported 3 0 0 AMD RV740 (HD 4700) -X.Org Gallium 0.4 on AMD RV770 supported 3 0 0 AMD RV770 (HD 4800) -X.Org Gallium 0.4 on AMD SUMO supported 3 1 4.1 AMD SUMO -X.Org Gallium 0.4 on AMD SUMO2 supported 3 1 4.1 AMD SUMO -X.Org Gallium 0.4 on AMD TURKS supported 3 0 2.1 AMD TURKS (HD 6500/6600) -X.Org R300 Project Gallium 0.4 on ATI R350 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI R580 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RC410 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS480 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS482 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS600 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS690 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV380 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV410 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV515 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV530 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV570 supported 0 1 2.1 ATI R300 (9700) -XGI Volari V3 unsupported 0 0 0 XGI -http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION supported 5 1 4.3 NVIDIA GTX 69x -nouveau Gallium 0.4 on NV34 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV42 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV44 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV46 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV49 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4A supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4B supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4C supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4E supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV50 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV63 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV67 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV84 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV86 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV92 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV94 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV96 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV98 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA0 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA3 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA5 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA8 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAA supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAC supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAF supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC0 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC1 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC3 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC4 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVCE supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVCF supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVD9 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE4 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE6 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE7 supported 1 1 2.1 Gallium diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt deleted file mode 100644 index 66cbeece97..0000000000 --- a/indra/newview/tests/gpus_seen.txt +++ /dev/null @@ -1,4225 +0,0 @@ -AMD BARTS (HD 6800) -AMD BARTS (HD 6800) -AMD CAICOS (HD 6400) -AMD CAICOS (HD 6400) -AMD CAYMAN (HD 6900) -AMD CEDAR (HD 5450) -AMD CEDAR (HD 5450) -AMD JUNIPER (HD 5700) -AMD PARK -AMD REDWOOD (HD 5500/5600) -AMD RS780 (HD 3200) -AMD RS880 (HD 4200) -AMD RS880 (HD 4200) -AMD RV610 (HD 2400) -AMD RV620 (HD 3400) -AMD RV630 (HD 2600) -AMD RV635 (HD 3600) -AMD RV670 (HD 3800) -AMD RV710 (HD 4300) -AMD RV730 (HD 4600) -AMD RV770 (HD 4800) -AMD RV790 (HD 4800) -AMD TURKS (HD 6500/6600) -ATI -ATI 760G/Radeon 3000 -ATI ASUS AH24xx -ATI ASUS AH34xx -ATI ASUS AH36xx -ATI ASUS AH46xx -ATI ASUS AX3xx -ATI ASUS AX5xx -ATI ASUS EAH38xx -ATI ASUS EAH43xx -ATI ASUS EAH45xx -ATI ASUS EAH48xx -ATI ASUS EAH54xx -ATI ASUS EAH57xx -ATI ASUS EAH58xx -ATI ASUS EAH64xx -ATI ASUS EAH65xx -ATI ASUS EAH66xx -ATI ASUS EAH67xx -ATI ASUS EAH68xx -ATI ASUS EAH69xx -ATI ASUS EAH6xxx -ATI ASUS EAH77xx -ATI ASUS HD7700 -ATI ASUS Radeon X1xxx -ATI All-in-Wonder HD -ATI All-in-Wonder PCI-E -ATI Display Adapter -ATI FireGL -ATI FireGL 5200 -ATI FireGL 5xxx -ATI FireMV -ATI FirePro 2000 -ATI FirePro 4000 -ATI FirePro M -ATI FirePro M3900 -ATI FirePro M5800 -ATI FirePro M7740 -ATI FirePro M7820 -ATI Geforce 9500 GT -ATI Geforce 9600 GT -ATI Geforce 9800 GT -ATI IGP 340M -ATI Mobility Radeon -ATI Mobility Radeon 4100 -ATI Mobility Radeon 4100 -ATI Mobility Radeon 7xxx -ATI Mobility Radeon 9600 -ATI Mobility Radeon 9700 -ATI Mobility Radeon 9800 -ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2700 -ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3800 -ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4300 -ATI Mobility Radeon HD 4500 -ATI Mobility Radeon HD 4600 -ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5300 -ATI Mobility Radeon HD 530v -ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 540v -ATI Mobility Radeon HD 545v -ATI Mobility Radeon HD 5500 -ATI Mobility Radeon HD 550v -ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 560v -ATI Mobility Radeon HD 565v -ATI Mobility Radeon HD 5700 -ATI Mobility Radeon HD 6300 -ATI Mobility Radeon HD 6300 -ATI Mobility Radeon HD 6500 -ATI Mobility Radeon HD 6500M -ATI Mobility Radeon X1xxx -ATI Mobility Radeon X2xxx -ATI Mobility Radeon X3xx -ATI Mobility Radeon X6xx -ATI Mobility Radeon X7xx -ATI Mobility Radeon Xxxx -ATI Mobility Radeon Xxxx -ATI R300 (9700) -ATI RV410 (X700) -ATI RV530 -ATI Radeon -ATI Radeon 2100 -ATI Radeon 3000 -ATI Radeon 3100 -ATI Radeon 3100 -ATI Radeon 5xxx -ATI Radeon 7000 -ATI Radeon 7xxx -ATI Radeon 8xxx -ATI Radeon 9000 -ATI Radeon 9100 -ATI Radeon 9200 -ATI Radeon 9500 -ATI Radeon 9600 -ATI Radeon 9700 -ATI Radeon 9800 -ATI Radeon HD 2300 -ATI Radeon HD 2300 -ATI Radeon HD 2400 -ATI Radeon HD 2400 -ATI Radeon HD 2600 -ATI Radeon HD 2900 -ATI Radeon HD 3000 -ATI Radeon HD 3100 -ATI Radeon HD 3200 -ATI Radeon HD 3200 -ATI Radeon HD 3300 -ATI Radeon HD 3400 -ATI Radeon HD 3400 -ATI Radeon HD 3400 -ATI Radeon HD 3500 -ATI Radeon HD 3600 -ATI Radeon HD 3700 -ATI Radeon HD 3800 -ATI Radeon HD 4200 -ATI Radeon HD 4300 -ATI Radeon HD 4300 -ATI Radeon HD 4400 -ATI Radeon HD 4500 -ATI Radeon HD 4500 -ATI Radeon HD 4600 -ATI Radeon HD 4700 -ATI Radeon HD 4800 -ATI Radeon HD 4800 -ATI Radeon HD 5400 -ATI Radeon HD 5400 -ATI Radeon HD 5500 -ATI Radeon HD 5500 -ATI Radeon HD 5600 -ATI Radeon HD 5700 -ATI Radeon HD 5700 -ATI Radeon HD 5800 -ATI Radeon HD 5900 -ATI Radeon HD 6200 -ATI Radeon HD 6200 -ATI Radeon HD 6300 -ATI Radeon HD 6300 -ATI Radeon HD 6300 -ATI Radeon HD 6300M -ATI Radeon HD 6400 -ATI Radeon HD 64xx -ATI Radeon HD 64xx -ATI Radeon HD 6500 -ATI Radeon HD 65xx -ATI Radeon HD 65xx -ATI Radeon HD 6600 -ATI Radeon HD 66xx -ATI Radeon HD 6700 -ATI Radeon HD 6700 -ATI Radeon HD 6700M -ATI Radeon HD 6800 -ATI Radeon HD 6900 -ATI Radeon HD 6900 -ATI Radeon HD 7200 -ATI Radeon HD 7300 -ATI Radeon HD 7300 -ATI Radeon HD 7400 -ATI Radeon HD 7400 -ATI Radeon HD 7500 -ATI Radeon HD 7600 -ATI Radeon HD 7700 -ATI Radeon HD 7800 -ATI Radeon HD 7900 -ATI Radeon X1000 -ATI Radeon X1200 -ATI Radeon X1300 -ATI Radeon X13xx -ATI Radeon X1400 -ATI Radeon X1500 -ATI Radeon X15xx -ATI Radeon X1600 -ATI Radeon X16xx -ATI Radeon X17xx -ATI Radeon X1800 -ATI Radeon X18xx -ATI Radeon X1900 -ATI Radeon X1900 -ATI Radeon X19xx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X2xxx -ATI Radeon X2xxx -ATI Radeon X300 -ATI Radeon X500 -ATI Radeon X500 -ATI Radeon X500 -ATI Radeon X600 -ATI Radeon X700 -ATI Radeon X800 -ATI Radeon Xpress -ATI Radeon Xpress -ATI Rage 128 -ATI Technologies -ATI Technologies Inc. -ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 -ATI Technologies Inc. 128MB ATI RADEON X600 SE -ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 -ATI Technologies Inc. 128MB ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 -ATI Technologies Inc. 256MB ATI RADEON X600 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 -ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) -ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G -ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD 760G -ATI Technologies Inc. AMD 760G -ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. AMD FirePro 2270 -ATI Technologies Inc. AMD FirePro 2460 -ATI Technologies Inc. AMD FirePro M2000 -ATI Technologies Inc. AMD FirePro M3900 -ATI Technologies Inc. AMD FirePro M4000 -ATI Technologies Inc. AMD FirePro M5950 -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics -ATI Technologies Inc. AMD FirePro V3900 -ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V4900 -ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro V5900 -ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro V7900 -ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro W5000 (FireGL V) -ATI Technologies Inc. AMD FirePro W9000 (FireGL V) -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 -ATI Technologies Inc. AMD RADEON HD 6350 -ATI Technologies Inc. AMD RADEON HD 6350 -ATI Technologies Inc. AMD RADEON HD 6450 -ATI Technologies Inc. AMD RADEON HD 6450 -ATI Technologies Inc. AMD RADEON HD 6450A -ATI Technologies Inc. AMD RADEON HD 6670 -ATI Technologies Inc. AMD RADEON HD 6670 -ATI Technologies Inc. AMD RADEON HD 7450 -ATI Technologies Inc. AMD RADEON HD6370D Graphics -ATI Technologies Inc. AMD RADEON HD6370D Graphics -ATI Technologies Inc. AMD RADEON HD6410D Graphics -ATI Technologies Inc. AMD RADEON HD6410D Graphics -ATI Technologies Inc. AMD RADEON HD6530D Graphics -ATI Technologies Inc. AMD RADEON HD6550D Graphics -ATI Technologies Inc. AMD Radeon -ATI Technologies Inc. AMD Radeon -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 5450 -ATI Technologies Inc. AMD Radeon HD 5500 Series -ATI Technologies Inc. AMD Radeon HD 5500 Series -ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics -ATI Technologies Inc. AMD Radeon HD 6250 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics -ATI Technologies Inc. AMD Radeon HD 6250 Graphics -ATI Technologies Inc. AMD Radeon HD 6250M -ATI Technologies Inc. AMD Radeon HD 6250M -ATI Technologies Inc. AMD Radeon HD 6290 -ATI Technologies Inc. AMD Radeon HD 6290 Graphics -ATI Technologies Inc. AMD Radeon HD 6290 Graphics -ATI Technologies Inc. AMD Radeon HD 6290M -ATI Technologies Inc. AMD Radeon HD 6290M -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics -ATI Technologies Inc. AMD Radeon HD 6300M Series -ATI Technologies Inc. AMD Radeon HD 6300M Series -ATI Technologies Inc. AMD Radeon HD 6310 -ATI Technologies Inc. AMD Radeon HD 6310 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6310M -ATI Technologies Inc. AMD Radeon HD 6310M -ATI Technologies Inc. AMD Radeon HD 6320 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphic -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics -ATI Technologies Inc. AMD Radeon HD 6320M -ATI Technologies Inc. AMD Radeon HD 6330M -ATI Technologies Inc. AMD Radeon HD 6350 -ATI Technologies Inc. AMD Radeon HD 6350 -ATI Technologies Inc. AMD Radeon HD 6370D -ATI Technologies Inc. AMD Radeon HD 6370M -ATI Technologies Inc. AMD Radeon HD 6370M -ATI Technologies Inc. AMD Radeon HD 6380G -ATI Technologies Inc. AMD Radeon HD 6400 Series -ATI Technologies Inc. AMD Radeon HD 6400M Series -ATI Technologies Inc. AMD Radeon HD 6410D -ATI Technologies Inc. AMD Radeon HD 6410D -ATI Technologies Inc. AMD Radeon HD 6410D Graphics -ATI Technologies Inc. AMD Radeon HD 6410D Graphics -ATI Technologies Inc. AMD Radeon HD 6450 -ATI Technologies Inc. AMD Radeon HD 6450 -ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6450 Graphics -ATI Technologies Inc. AMD Radeon HD 6450A -ATI Technologies Inc. AMD Radeon HD 6450A Graphics -ATI Technologies Inc. AMD Radeon HD 6450M -ATI Technologies Inc. AMD Radeon HD 6450M -ATI Technologies Inc. AMD Radeon HD 6470M -ATI Technologies Inc. AMD Radeon HD 6470M -ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series -ATI Technologies Inc. AMD Radeon HD 6480G -ATI Technologies Inc. AMD Radeon HD 6480M -ATI Technologies Inc. AMD Radeon HD 6490M -ATI Technologies Inc. AMD Radeon HD 6500 Series -ATI Technologies Inc. AMD Radeon HD 6500 Series -ATI Technologies Inc. AMD Radeon HD 6500 series graphics -ATI Technologies Inc. AMD Radeon HD 6500M Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6510 Series -ATI Technologies Inc. AMD Radeon HD 6510 Series -ATI Technologies Inc. AMD Radeon HD 6520G -ATI Technologies Inc. AMD Radeon HD 6520G -ATI Technologies Inc. AMD Radeon HD 6530D -ATI Technologies Inc. AMD Radeon HD 6530D -ATI Technologies Inc. AMD Radeon HD 6530D Graphics -ATI Technologies Inc. AMD Radeon HD 6530D Graphics -ATI Technologies Inc. AMD Radeon HD 6530M -ATI Technologies Inc. AMD Radeon HD 6550A -ATI Technologies Inc. AMD Radeon HD 6550A -ATI Technologies Inc. AMD Radeon HD 6550D -ATI Technologies Inc. AMD Radeon HD 6550D -ATI Technologies Inc. AMD Radeon HD 6550D Graphics -ATI Technologies Inc. AMD Radeon HD 6550D Graphics -ATI Technologies Inc. AMD Radeon HD 6550M -ATI Technologies Inc. AMD Radeon HD 6550M -ATI Technologies Inc. AMD Radeon HD 6570 -ATI Technologies Inc. AMD Radeon HD 6570 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6570M -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series -ATI Technologies Inc. AMD Radeon HD 6570M/5730 -ATI Technologies Inc. AMD Radeon HD 6600 Series -ATI Technologies Inc. AMD Radeon HD 6600 Series -ATI Technologies Inc. AMD Radeon HD 6600M Series -ATI Technologies Inc. AMD Radeon HD 6610M Graphics -ATI Technologies Inc. AMD Radeon HD 6620G -ATI Technologies Inc. AMD Radeon HD 6620G -ATI Technologies Inc. AMD Radeon HD 6625M Graphics -ATI Technologies Inc. AMD Radeon HD 6630M -ATI Technologies Inc. AMD Radeon HD 6630M -ATI Technologies Inc. AMD Radeon HD 6650A Graphics -ATI Technologies Inc. AMD Radeon HD 6650M -ATI Technologies Inc. AMD Radeon HD 6650M -ATI Technologies Inc. AMD Radeon HD 6670 -ATI Technologies Inc. AMD Radeon HD 6670 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6700 Series -ATI Technologies Inc. AMD Radeon HD 6700 Series -ATI Technologies Inc. AMD Radeon HD 6700 series -ATI Technologies Inc. AMD Radeon HD 6700M Series -ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series -ATI Technologies Inc. AMD Radeon HD 6730M -ATI Technologies Inc. AMD Radeon HD 6750 -ATI Technologies Inc. AMD Radeon HD 6750M -ATI Technologies Inc. AMD Radeon HD 6750M -ATI Technologies Inc. AMD Radeon HD 6770 -ATI Technologies Inc. AMD Radeon HD 6770M -ATI Technologies Inc. AMD Radeon HD 6770M -ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6800M Series -ATI Technologies Inc. AMD Radeon HD 6800M Series -ATI Technologies Inc. AMD Radeon HD 6850 -ATI Technologies Inc. AMD Radeon HD 6850 -ATI Technologies Inc. AMD Radeon HD 6850 X2 -ATI Technologies Inc. AMD Radeon HD 6850M -ATI Technologies Inc. AMD Radeon HD 6850M -ATI Technologies Inc. AMD Radeon HD 6870 -ATI Technologies Inc. AMD Radeon HD 6870M -ATI Technologies Inc. AMD Radeon HD 6870M -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6900M Series -ATI Technologies Inc. AMD Radeon HD 6900M Series -ATI Technologies Inc. AMD Radeon HD 6970 -ATI Technologies Inc. AMD Radeon HD 6970 -ATI Technologies Inc. AMD Radeon HD 6970M -ATI Technologies Inc. AMD Radeon HD 6970M -ATI Technologies Inc. AMD Radeon HD 6990 -ATI Technologies Inc. AMD Radeon HD 6990 -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 7000 series -ATI Technologies Inc. AMD Radeon HD 7000 series -ATI Technologies Inc. AMD Radeon HD 7290 Graphics -ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics -ATI Technologies Inc. AMD Radeon HD 7310 -ATI Technologies Inc. AMD Radeon HD 7310 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7310G -ATI Technologies Inc. AMD Radeon HD 7310M -ATI Technologies Inc. AMD Radeon HD 7310M -ATI Technologies Inc. AMD Radeon HD 7340 -ATI Technologies Inc. AMD Radeon HD 7340 -ATI Technologies Inc. AMD Radeon HD 7340 Graphics -ATI Technologies Inc. AMD Radeon HD 7340 Graphics -ATI Technologies Inc. AMD Radeon HD 7340G -ATI Technologies Inc. AMD Radeon HD 7340G -ATI Technologies Inc. AMD Radeon HD 7340M -ATI Technologies Inc. AMD Radeon HD 7340M -ATI Technologies Inc. AMD Radeon HD 7350 -ATI Technologies Inc. AMD Radeon HD 7350 -ATI Technologies Inc. AMD Radeon HD 7350 Graphics -ATI Technologies Inc. AMD Radeon HD 7370M -ATI Technologies Inc. AMD Radeon HD 7400 Series -ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7400G -ATI Technologies Inc. AMD Radeon HD 7400G -ATI Technologies Inc. AMD Radeon HD 7400M Series -ATI Technologies Inc. AMD Radeon HD 7400M Series -ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7410M -ATI Technologies Inc. AMD Radeon HD 7420G -ATI Technologies Inc. AMD Radeon HD 7420G -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 Graphics -ATI Technologies Inc. AMD Radeon HD 7450A Graphics -ATI Technologies Inc. AMD Radeon HD 7450A Graphics -ATI Technologies Inc. AMD Radeon HD 7450M -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 Series -ATI Technologies Inc. AMD Radeon HD 7470 Series -ATI Technologies Inc. AMD Radeon HD 7470M -ATI Technologies Inc. AMD Radeon HD 7470M -ATI Technologies Inc. AMD Radeon HD 7480D -ATI Technologies Inc. AMD Radeon HD 7480D -ATI Technologies Inc. AMD Radeon HD 7500 Series -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7500/7600 Series -ATI Technologies Inc. AMD Radeon HD 7500G -ATI Technologies Inc. AMD Radeon HD 7500G -ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series -ATI Technologies Inc. AMD Radeon HD 7510 -ATI Technologies Inc. AMD Radeon HD 7510 -ATI Technologies Inc. AMD Radeon HD 7520G -ATI Technologies Inc. AMD Radeon HD 7520G -ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7540D -ATI Technologies Inc. AMD Radeon HD 7540D -ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7550M -ATI Technologies Inc. AMD Radeon HD 7550M -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics -ATI Technologies Inc. AMD Radeon HD 7560D -ATI Technologies Inc. AMD Radeon HD 7560D -ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7570 -ATI Technologies Inc. AMD Radeon HD 7570 -ATI Technologies Inc. AMD Radeon HD 7570 Graphics -ATI Technologies Inc. AMD Radeon HD 7570 Series -ATI Technologies Inc. AMD Radeon HD 7570M -ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics -ATI Technologies Inc. AMD Radeon HD 7580D -ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7600G -ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600M Series -ATI Technologies Inc. AMD Radeon HD 7600M Series -ATI Technologies Inc. AMD Radeon HD 7610M -ATI Technologies Inc. AMD Radeon HD 7610M -ATI Technologies Inc. AMD Radeon HD 7620G -ATI Technologies Inc. AMD Radeon HD 7640G -ATI Technologies Inc. AMD Radeon HD 7640G -ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7650A -ATI Technologies Inc. AMD Radeon HD 7650A Graphics -ATI Technologies Inc. AMD Radeon HD 7650M -ATI Technologies Inc. AMD Radeon HD 7650M -ATI Technologies Inc. AMD Radeon HD 7650M Series -ATI Technologies Inc. AMD Radeon HD 7660D -ATI Technologies Inc. AMD Radeon HD 7660D -ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G -ATI Technologies Inc. AMD Radeon HD 7660G -ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7670 -ATI Technologies Inc. AMD Radeon HD 7670 -ATI Technologies Inc. AMD Radeon HD 7670M -ATI Technologies Inc. AMD Radeon HD 7670M -ATI Technologies Inc. AMD Radeon HD 7690M -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7700M Series -ATI Technologies Inc. AMD Radeon HD 7730M -ATI Technologies Inc. AMD Radeon HD 7770 -ATI Technologies Inc. AMD Radeon HD 7770 -ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7800M Series -ATI Technologies Inc. AMD Radeon HD 7800M Series -ATI Technologies Inc. AMD Radeon HD 7870 -ATI Technologies Inc. AMD Radeon HD 7870 -ATI Technologies Inc. AMD Radeon HD 7870M -ATI Technologies Inc. AMD Radeon HD 7870M -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7970 -ATI Technologies Inc. AMD Radeon HD 7970 -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 8210 -ATI Technologies Inc. AMD Radeon HD 8240 -ATI Technologies Inc. AMD Radeon HD 8250 -ATI Technologies Inc. AMD Radeon HD 8280G -ATI Technologies Inc. AMD Radeon HD 8330 -ATI Technologies Inc. AMD Radeon HD 8330 -ATI Technologies Inc. AMD Radeon HD 8350 -ATI Technologies Inc. AMD Radeon HD 8350 -ATI Technologies Inc. AMD Radeon HD 8350G -ATI Technologies Inc. AMD Radeon HD 8400 -ATI Technologies Inc. AMD Radeon HD 8450 -ATI Technologies Inc. AMD Radeon HD 8450G -ATI Technologies Inc. AMD Radeon HD 8470 -ATI Technologies Inc. AMD Radeon HD 8470 -ATI Technologies Inc. AMD Radeon HD 8470D -ATI Technologies Inc. AMD Radeon HD 8550G -ATI Technologies Inc. AMD Radeon HD 8550G -ATI Technologies Inc. AMD Radeon HD 8570 -ATI Technologies Inc. AMD Radeon HD 8570 -ATI Technologies Inc. AMD Radeon HD 8570D -ATI Technologies Inc. AMD Radeon HD 8570D -ATI Technologies Inc. AMD Radeon HD 8610G -ATI Technologies Inc. AMD Radeon HD 8650G -ATI Technologies Inc. AMD Radeon HD 8650G -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 8700M Series -ATI Technologies Inc. AMD Radeon HD 8700M Series -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8750M -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8800M Series -ATI Technologies Inc. AMD Radeon HD 8800M Series -ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) -ATI Technologies Inc. AMD Radeon HD 8950 -ATI Technologies Inc. AMD Radeon HD 8950 -ATI Technologies Inc. AMD Radeon HD HD7850M -ATI Technologies Inc. AMD Radeon HD HD7850M -ATI Technologies Inc. AMD Radeon HD6370D Graphics -ATI Technologies Inc. AMD Radeon HD6370D Graphics -ATI Technologies Inc. AMD Radeon HD7610M -ATI Technologies Inc. AMD Radeon HD7610M -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7770 -ATI Technologies Inc. AMD Radeon HD7770 -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD8350 -ATI Technologies Inc. AMD Radeon(TM) HD 6380G -ATI Technologies Inc. AMD Radeon(TM) HD 6380G -ATI Technologies Inc. AMD Radeon(TM) HD 6470M -ATI Technologies Inc. AMD Radeon(TM) HD 6470M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G -ATI Technologies Inc. AMD Radeon(TM) HD 6480G -ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon(TM) HD 6520G -ATI Technologies Inc. AMD Radeon(TM) HD 6520G -ATI Technologies Inc. AMD Radeon(TM) HD 6620G -ATI Technologies Inc. AMD Radeon(TM) HD 6620G -ATI Technologies Inc. AMD Radeon(TM) HD 6630M -ATI Technologies Inc. AMD Radeon(TM) HD 6650M -ATI Technologies Inc. AMD Radeon(TM) HD 7450 -ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7670M -ATI Technologies Inc. AMD Radeon(TM) HD 8350 -ATI Technologies Inc. AMD Radeon(TM) HD8490 -ATI Technologies Inc. AMD Radeon. HD 7350 -ATI Technologies Inc. AMD Radeon. HD 7670M -ATI Technologies Inc. AMD Radeon. HD 7730M -ATI Technologies Inc. AMD Radeon. HD 7730M -ATI Technologies Inc. ASUS AH3450 Series -ATI Technologies Inc. ASUS AH3450 Series -ATI Technologies Inc. ASUS AH3650 Series -ATI Technologies Inc. ASUS AH4650 Series -ATI Technologies Inc. ASUS ARES -ATI Technologies Inc. ASUS ARES2 -ATI Technologies Inc. ASUS EAH2400 Series -ATI Technologies Inc. ASUS EAH2600 Series -ATI Technologies Inc. ASUS EAH3450 Series -ATI Technologies Inc. ASUS EAH3650 Series -ATI Technologies Inc. ASUS EAH3850 Series -ATI Technologies Inc. ASUS EAH3870 Series -ATI Technologies Inc. ASUS EAH4350 series -ATI Technologies Inc. ASUS EAH4350 series -ATI Technologies Inc. ASUS EAH4550 series -ATI Technologies Inc. ASUS EAH4650 series -ATI Technologies Inc. ASUS EAH4670 series -ATI Technologies Inc. ASUS EAH4770 Series -ATI Technologies Inc. ASUS EAH4770 series -ATI Technologies Inc. ASUS EAH4850 series -ATI Technologies Inc. ASUS EAH4870 series -ATI Technologies Inc. ASUS EAH4870x2 -ATI Technologies Inc. ASUS EAH4890 -ATI Technologies Inc. ASUS EAH5450 Series -ATI Technologies Inc. ASUS EAH5450 Series -ATI Technologies Inc. ASUS EAH5550 Series -ATI Technologies Inc. ASUS EAH5550 Series -ATI Technologies Inc. ASUS EAH5570 series -ATI Technologies Inc. ASUS EAH5570 series -ATI Technologies Inc. ASUS EAH5670 Series -ATI Technologies Inc. ASUS EAH5750 Series -ATI Technologies Inc. ASUS EAH5750 Series -ATI Technologies Inc. ASUS EAH5770 Series -ATI Technologies Inc. ASUS EAH5770 Series -ATI Technologies Inc. ASUS EAH5830 Series -ATI Technologies Inc. ASUS EAH5830 Series -ATI Technologies Inc. ASUS EAH5850 Series -ATI Technologies Inc. ASUS EAH5850 Series -ATI Technologies Inc. ASUS EAH5870 Series -ATI Technologies Inc. ASUS EAH5870 Series -ATI Technologies Inc. ASUS EAH6450 Series -ATI Technologies Inc. ASUS EAH6450 Series -ATI Technologies Inc. ASUS EAH6570 Series -ATI Technologies Inc. ASUS EAH6570 Series -ATI Technologies Inc. ASUS EAH6670 Series -ATI Technologies Inc. ASUS EAH6670 Series -ATI Technologies Inc. ASUS EAH6750 Series -ATI Technologies Inc. ASUS EAH6750 Series -ATI Technologies Inc. ASUS EAH6770 Series -ATI Technologies Inc. ASUS EAH6770 Series -ATI Technologies Inc. ASUS EAH6850 Series -ATI Technologies Inc. ASUS EAH6850 Series -ATI Technologies Inc. ASUS EAH6870 Series -ATI Technologies Inc. ASUS EAH6870 Series -ATI Technologies Inc. ASUS EAH6950 Series -ATI Technologies Inc. ASUS EAH6950 Series -ATI Technologies Inc. ASUS EAH6970 Series -ATI Technologies Inc. ASUS EAH6970 Series -ATI Technologies Inc. ASUS Extreme AX300 Series -ATI Technologies Inc. ASUS Extreme AX300SE/T -ATI Technologies Inc. ASUS Extreme AX550 Series -ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 -ATI Technologies Inc. ASUS Extreme AX600 Series -ATI Technologies Inc. ASUS HD 7350 -ATI Technologies Inc. ASUS HD7470 Series -ATI Technologies Inc. ASUS HD7670 Series -ATI Technologies Inc. ASUS HD7670 Series -ATI Technologies Inc. ASUS HD7750 Series -ATI Technologies Inc. ASUS HD7750 Series -ATI Technologies Inc. ASUS HD7770 Series -ATI Technologies Inc. ASUS HD7770 Series -ATI Technologies Inc. ASUS HD7790 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS X1300 Series -ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1300 Series x86/SSE2 -ATI Technologies Inc. ASUS X1300 x86/SSE2 -ATI Technologies Inc. ASUS X1550 Series -ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1550 Series x86/SSE2 -ATI Technologies Inc. ASUS X1600 Series -ATI Technologies Inc. ASUS X1600 Series x86 -ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1600 Series x86/SSE2 -ATI Technologies Inc. ASUS X1650 Series -ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1650 Series x86/SSE2 -ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon HD 5000 Series -ATI Technologies Inc. ATI Radeon HD 6350 -ATI Technologies Inc. ATI All-in-Wonder HD -ATI Technologies Inc. ATI Display Adapter -ATI Technologies Inc. ATI FireGL V3100 -ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3300 -ATI Technologies Inc. ATI FireGL V3350 -ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3600 -ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V5600 -ATI Technologies Inc. ATI FireGL V7200 -ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V7600 -ATI Technologies Inc. ATI FireGL V7700 -ATI Technologies Inc. ATI FireMV 2250 -ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 -ATI Technologies Inc. ATI FirePro 2260 -ATI Technologies Inc. ATI FirePro 2260 -ATI Technologies Inc. ATI FirePro 2450 -ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter -ATI Technologies Inc. ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 -ATI Technologies Inc. ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 (FireGL) -ATI Technologies Inc. ATI FirePro V3700 (FireGL) -ATI Technologies Inc. ATI FirePro V3800 -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter -ATI Technologies Inc. ATI FirePro V3800 (FireGL) -ATI Technologies Inc. ATI FirePro V4800 -ATI Technologies Inc. ATI FirePro V4800 (FireGL V) -ATI Technologies Inc. ATI FirePro V4800 (FireGL) -ATI Technologies Inc. ATI FirePro V5700 (FireGL) -ATI Technologies Inc. ATI FirePro V5800 (FireGL V) -ATI Technologies Inc. ATI FirePro V5800 (FireGL) -ATI Technologies Inc. ATI FirePro V7800 (FireGL V) -ATI Technologies Inc. ATI FirePro V7800 (FireGL) -ATI Technologies Inc. ATI FirePro V8700 (FireGL) -ATI Technologies Inc. ATI FirePro V9800 (FireGL V) -ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e -ATI Technologies Inc. ATI MOBILITY FireGL V3200 -ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) -ATI Technologies Inc. ATI MOBILITY FireGL V5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI MOBILITY FireGL V5250 -ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 -ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 -ATI Technologies Inc. ATI MOBILITY RADEON X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1350 -ATI Technologies Inc. ATI MOBILITY RADEON X1400 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X1700 -ATI Technologies Inc. ATI MOBILITY RADEON X1800 -ATI Technologies Inc. ATI MOBILITY RADEON X1900 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X600 -ATI Technologies Inc. ATI MOBILITY RADEON X600 SE -ATI Technologies Inc. ATI MOBILITY RADEON X700 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 -ATI Technologies Inc. ATI Mobility FireGL V5700 -ATI Technologies Inc. ATI Mobility FireGL V5725 -ATI Technologies Inc. ATI Mobility FireGL V5725 -ATI Technologies Inc. ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT -ATI Technologies Inc. ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 2700 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3410 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3450 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3650 -ATI Technologies Inc. ATI Mobility Radeon HD 3650 -ATI Technologies Inc. ATI Mobility Radeon HD 3670 -ATI Technologies Inc. ATI Mobility Radeon HD 3850 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4225 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4250 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4270 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4330 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4350 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4530 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4550 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4650 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4670 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4830 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4850 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 -ATI Technologies Inc. ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series -ATI Technologies Inc. ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470 -ATI Technologies Inc. ATI Mobility Radeon HD 5470 -ATI Technologies Inc. ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5570 -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series -ATI Technologies Inc. ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650 -ATI Technologies Inc. ATI Mobility Radeon HD 5650 -ATI Technologies Inc. ATI Mobility Radeon HD 565v -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5730 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5850 -ATI Technologies Inc. ATI Mobility Radeon HD 5850 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 -ATI Technologies Inc. ATI Mobility Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1350 -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) -ATI Technologies Inc. ATI Mobility Radeon X1400 x86 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1900 -ATI Technologies Inc. ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon. HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 -ATI Technologies Inc. ATI RADEON 9600 Series -ATI Technologies Inc. ATI RADEON 9600/X1050 Series -ATI Technologies Inc. ATI RADEON E4690 -ATI Technologies Inc. ATI RADEON HD 3200 Graphics -ATI Technologies Inc. ATI RADEON XPRESS 1100 -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series -ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 1200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 -ATI Technologies Inc. ATI RADEON XPRESS 200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES -ATI Technologies Inc. ATI RADEON XPRESS 200M Series -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 2100 Graphics -ATI Technologies Inc. ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon 3000 Series Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon 3100 Series Graphics -ATI Technologies Inc. ATI Radeon 9550 / X1050 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Graphics Processor -ATI Technologies Inc. ATI Radeon HD 2350 -ATI Technologies Inc. ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 PCI -ATI Technologies Inc. ATI Radeon HD 2400 PRO -ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP -ATI Technologies Inc. ATI Radeon HD 2400 Pro -ATI Technologies Inc. ATI Radeon HD 2400 Series -ATI Technologies Inc. ATI Radeon HD 2400 Series AGP -ATI Technologies Inc. ATI Radeon HD 2400 XT -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 PRO -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 Pro -ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP -ATI Technologies Inc. ATI Radeon HD 2600 Series -ATI Technologies Inc. ATI Radeon HD 2600 Series AGP -ATI Technologies Inc. ATI Radeon HD 2600 XT -ATI Technologies Inc. ATI Radeon HD 2600/3600 Series -ATI Technologies Inc. ATI Radeon HD 2900 GT -ATI Technologies Inc. ATI Radeon HD 2900 PRO -ATI Technologies Inc. ATI Radeon HD 2900 XT -ATI Technologies Inc. ATI Radeon HD 3200 Graphics -ATI Technologies Inc. ATI Radeon HD 3200 Graphics -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 3300 Graphics -ATI Technologies Inc. ATI Radeon HD 3400 Series -ATI Technologies Inc. ATI Radeon HD 3400 Series -ATI Technologies Inc. ATI Radeon HD 3450 -ATI Technologies Inc. ATI Radeon HD 3450 -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3450 AGP -ATI Technologies Inc. ATI Radeon HD 3470 -ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3600 Series -ATI Technologies Inc. ATI Radeon HD 3600 Series -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 3650 -ATI Technologies Inc. ATI Radeon HD 3650 AGP -ATI Technologies Inc. ATI Radeon HD 3800 Series -ATI Technologies Inc. ATI Radeon HD 3850 -ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3850 AGP -ATI Technologies Inc. ATI Radeon HD 3870 -ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 3870 X2 -ATI Technologies Inc. ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 -ATI Technologies Inc. ATI Radeon HD 4250 -ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Radeon HD 4270 -ATI Technologies Inc. ATI Radeon HD 4270 -ATI Technologies Inc. ATI Radeon HD 4290 -ATI Technologies Inc. ATI Radeon HD 4300 Series -ATI Technologies Inc. ATI Radeon HD 4300 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4350 -ATI Technologies Inc. ATI Radeon HD 4350 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 4450 -ATI Technologies Inc. ATI Radeon HD 4500 Series -ATI Technologies Inc. ATI Radeon HD 4520 -ATI Technologies Inc. ATI Radeon HD 4550 -ATI Technologies Inc. ATI Radeon HD 4550 -ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4570 -ATI Technologies Inc. ATI Radeon HD 4580 -ATI Technologies Inc. ATI Radeon HD 4590 -ATI Technologies Inc. ATI Radeon HD 4600 Series -ATI Technologies Inc. ATI Radeon HD 4600 Series -ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4650 -ATI Technologies Inc. ATI Radeon HD 4650 -ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 4670 -ATI Technologies Inc. ATI Radeon HD 4670 -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4700 Series -ATI Technologies Inc. ATI Radeon HD 4700 Series -ATI Technologies Inc. ATI Radeon HD 4720 -ATI Technologies Inc. ATI Radeon HD 4730 -ATI Technologies Inc. ATI Radeon HD 4730 Series -ATI Technologies Inc. ATI Radeon HD 4770 -ATI Technologies Inc. ATI Radeon HD 4770 -ATI Technologies Inc. ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series -ATI Technologies Inc. ATI Radeon HD 4800 Series -ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4810 series -ATI Technologies Inc. ATI Radeon HD 4830 -ATI Technologies Inc. ATI Radeon HD 4850 -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 Series -ATI Technologies Inc. ATI Radeon HD 4850 X2 -ATI Technologies Inc. ATI Radeon HD 4870 -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4870 Series -ATI Technologies Inc. ATI Radeon HD 4870 X2 -ATI Technologies Inc. ATI Radeon HD 5400 Series -ATI Technologies Inc. ATI Radeon HD 5400 Series -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Radeon HD 5470 -ATI Technologies Inc. ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5500 Series -ATI Technologies Inc. ATI Radeon HD 5500 Series -ATI Technologies Inc. ATI Radeon HD 5530 -ATI Technologies Inc. ATI Radeon HD 5570 -ATI Technologies Inc. ATI Radeon HD 5570 -ATI Technologies Inc. ATI Radeon HD 5600 Series -ATI Technologies Inc. ATI Radeon HD 5600 Series -ATI Technologies Inc. ATI Radeon HD 5600/5700 -ATI Technologies Inc. ATI Radeon HD 5630 -ATI Technologies Inc. ATI Radeon HD 5670 -ATI Technologies Inc. ATI Radeon HD 5670 -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5700 Series -ATI Technologies Inc. ATI Radeon HD 5700 Series -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Radeon HD 5750 -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 Series -ATI Technologies Inc. ATI Radeon HD 5770 -ATI Technologies Inc. ATI Radeon HD 5770 -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5850 -ATI Technologies Inc. ATI Radeon HD 5850 -ATI Technologies Inc. ATI Radeon HD 5870 -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5900 Series -ATI Technologies Inc. ATI Radeon HD 5900 Series -ATI Technologies Inc. ATI Radeon HD 5970 -ATI Technologies Inc. ATI Radeon HD 6230 -ATI Technologies Inc. ATI Radeon HD 6230 -ATI Technologies Inc. ATI Radeon HD 6290 -ATI Technologies Inc. ATI Radeon HD 6350 -ATI Technologies Inc. ATI Radeon HD 6390 -ATI Technologies Inc. ATI Radeon HD 6490 -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6510 -ATI Technologies Inc. ATI Radeon HD 6510 -ATI Technologies Inc. ATI Radeon HD 6570M -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770 -ATI Technologies Inc. ATI Radeon HD 6770 -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7350 -ATI Technologies Inc. ATI Radeon HD 7350 -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD3750 -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series -ATI Technologies Inc. ATI Radeon HD4650 -ATI Technologies Inc. ATI Radeon HD4670 -ATI Technologies Inc. ATI Radeon HD4670 -ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon X1050 -ATI Technologies Inc. ATI Radeon X1050 Series -ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 -ATI Technologies Inc. ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series -ATI Technologies Inc. ATI Radeon X1200 Series -ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1270 -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1300 / X1550 Series -ATI Technologies Inc. ATI Radeon X1300/X1550 Series -ATI Technologies Inc. ATI Radeon X1550 -ATI Technologies Inc. ATI Radeon X1550 Series -ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1950 GT -ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series -ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series -ATI Technologies Inc. ATI Radeon Xpress 1100 -ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1150 -ATI Technologies Inc. ATI Radeon Xpress 1150 Series -ATI Technologies Inc. ATI Radeon Xpress 1150 Series -ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 Series -ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1250 -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress Series -ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Diamond Radeon X1550 -ATI Technologies Inc. Diamond Radeon X1550 Series -ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 -ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) -ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) -ATI Technologies Inc. FireGL X1-128 -ATI Technologies Inc. FireMV 2400 PCI DDR x86 -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 -ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics -ATI Technologies Inc. GIGABYTE RADEON 9600 PRO -ATI Technologies Inc. GIGABYTE Radeon X1300 Pro -ATI Technologies Inc. GIGABYTE Radeon X1300 Series -ATI Technologies Inc. GIGABYTE Radeon X1600 PRO -ATI Technologies Inc. GeCube RADEON 9600XT -ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 -ATI Technologies Inc. GeCube RADEON X700 Series -ATI Technologies Inc. GeCube Radeon X1550 -ATI Technologies Inc. GeCube Radeon X1550 Series -ATI Technologies Inc. GeCube Radeon X1550 Series -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 -ATI Technologies Inc. GigaByte Radeon X1050 -ATI Technologies Inc. Gigabyte RADEON X300 -ATI Technologies Inc. Gigabyte RADEON X300 -ATI Technologies Inc. Gigabyte RADEON X300 SE -ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 -ATI Technologies Inc. HD3730 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 -ATI Technologies Inc. HIGHTECH RADEON 9600XT -ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 -ATI Technologies Inc. M52 x86 -ATI Technologies Inc. M72-M -ATI Technologies Inc. MEDION RADEON 9600 TX -ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 -ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) -ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9600 x86 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9700 x86 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X300 x86 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X600 x86 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 -ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE -ATI Technologies Inc. MSI Radeon X1550 -ATI Technologies Inc. Mobility Radeon X2300 HD -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 -ATI Technologies Inc. RADEON 7000 SDR x86 -ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 -ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 -ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 -ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 -ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9100 IGP DDR x86 -ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9500 -ATI Technologies Inc. RADEON 9500 PRO / 9700 -ATI Technologies Inc. RADEON 9550 -ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9550 x86/SSE2 -ATI Technologies Inc. RADEON 9600 SERIES -ATI Technologies Inc. RADEON 9600 TX -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 -ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600 XT x86/SSE2 -ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600 x86/SSE2 -ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600SE x86/SSE2 -ATI Technologies Inc. RADEON 9700 PRO -ATI Technologies Inc. RADEON 9800 PRO -ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON 9800 PRO - Secondary -ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 -ATI Technologies Inc. RADEON 9800 SERIES -ATI Technologies Inc. RADEON 9800 XT -ATI Technologies Inc. RADEON 9800 XT x86/SSE2 -ATI Technologies Inc. RADEON 9800 x86/SSE2 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 -ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X1600 Series x86/SSE2 -ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 -ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300 Series -ATI Technologies Inc. RADEON X300 Series x86/SSE2 -ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300 x86/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86 -ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X550 x86/SSE2 -ATI Technologies Inc. RADEON X550XT -ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 -ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X600 PRO x86/SSE2 -ATI Technologies Inc. RADEON X600 SE x86/SSE2 -ATI Technologies Inc. RADEON X600 Series -ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X600 x86/SSE2 -ATI Technologies Inc. RADEON X600/X550 Series -ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X600/X550 Series Secondary -ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 PRO x86/SSE2 -ATI Technologies Inc. RADEON X700 SE -ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 SE x86/SSE2 -ATI Technologies Inc. RADEON X700 Series -ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 Series x86/SSE2 -ATI Technologies Inc. RADEON X700 x86/SSE2 -ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 GTO -ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 GTO x86/SSE2 -ATI Technologies Inc. RADEON X800 PRO/GTO -ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 SE x86/SSE2 -ATI Technologies Inc. RADEON X800 Series -ATI Technologies Inc. RADEON X800 Series -ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 XL x86/SSE2 -ATI Technologies Inc. RADEON X800 XT -ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X800 XT x86/SSE2 -ATI Technologies Inc. RADEON X800/X850 Series -ATI Technologies Inc. RADEON X800GT -ATI Technologies Inc. RADEON X850 Series -ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 -ATI Technologies Inc. RADEON X850 XT x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 -ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ROBSON CE -ATI Technologies Inc. ROBSON LE -ATI Technologies Inc. RS780M -ATI Technologies Inc. RS880 -ATI Technologies Inc. RS880 -ATI Technologies Inc. RV250 DDR x86/SSE2 -ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 6370M -ATI Technologies Inc. Radeon (TM) HD 6470M -ATI Technologies Inc. Radeon (TM) HD 6470M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6630M -ATI Technologies Inc. Radeon (TM) HD 6750M -ATI Technologies Inc. Radeon (TM) HD 6750M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6850M -ATI Technologies Inc. Radeon (TM) HD 6850M -ATI Technologies Inc. Radeon (TM) HD 7450M -ATI Technologies Inc. Radeon (TM) HD 7470M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7750M -ATI Technologies Inc. Radeon (TM) HD 7750M -ATI Technologies Inc. Radeon (TM) HD 7850M -ATI Technologies Inc. Radeon (TM) HD 7850M -ATI Technologies Inc. Radeon (TM) HD 8750M -ATI Technologies Inc. Radeon (TM) HD 8750M -ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 -ATI Technologies Inc. Radeon 7500 DDR x86 -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 -ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 -ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) -ATI Technologies Inc. Radeon HD 6470M -ATI Technologies Inc. Radeon HD 6470M -ATI Technologies Inc. Radeon HD 6490M -ATI Technologies Inc. Radeon HD 6800 Series -ATI Technologies Inc. Radeon HD 6800 Series -ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. Radeon X1050 -ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1300 / X1550 Series -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300 / X1600 Series -ATI Technologies Inc. Radeon X1300 Series -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 -ATI Technologies Inc. Radeon X1300/X1550 Series -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 -ATI Technologies Inc. Radeon X1550 Series -ATI Technologies Inc. Radeon X1550 Series -ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 -ATI Technologies Inc. Radeon X1600 Series -ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1600 Series x86/SSE2 -ATI Technologies Inc. Radeon X1600 x86/SSE2 -ATI Technologies Inc. Radeon X1600/1650 Series -ATI Technologies Inc. Radeon X1600/X1650 Series -ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650 GTO -ATI Technologies Inc. Radeon X1650 SE -ATI Technologies Inc. Radeon X1650 SE x86/SSE2 -ATI Technologies Inc. Radeon X1650 Series -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1700 FSC -ATI Technologies Inc. Radeon X1800 CrossFire Edition -ATI Technologies Inc. Radeon X1800 Series -ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1900 CrossFire Edition -ATI Technologies Inc. Radeon X1900 GT -ATI Technologies Inc. Radeon X1900 GT x86/SSE2 -ATI Technologies Inc. Radeon X1900 Series -ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1900 Series x86/SSE2 -ATI Technologies Inc. Radeon X1950 CrossFire Edition -ATI Technologies Inc. Radeon X1950 Pro -ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 -ATI Technologies Inc. Radeon X1950 Series -ATI Technologies Inc. Radeon X1950 Series -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1950 Series x86/SSE2 -ATI Technologies Inc. Radeon X300/X550/X1050 Series -ATI Technologies Inc. Radeon X300/X550/X1050 Series -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. Radeon X550/X700 Series -ATI Technologies Inc. Radeon X550XTX -ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 -ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) -ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS -ATI Technologies Inc. SAPPHIRE RADEON X300SE -ATI Technologies Inc. SAPPHIRE Radeon X1550 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. SUMO 9640 -ATI Technologies Inc. SUMO 964A -ATI Technologies Inc. Sapphire RADEON X1600 PRO -ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 -ATI Technologies Inc. Sapphire RADEON X1600 XT -ATI Technologies Inc. Tul Corporation, RADEON X1300 Series -ATI Technologies Inc. Tul Corporation, RADEON X300SE -ATI Technologies Inc. VisionTek Radeon 4350 -ATI Technologies Inc. VisionTek Radeon 4350 -ATI Technologies Inc. VisionTek Radeon HD 2400 PCI -ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP -ATI Technologies Inc. VisionTek Radeon HD 5450 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP -ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI -ATI Technologies Inc. VisionTek Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 Series -ATI Technologies Inc. VisionTek Radeon X1300 XGE -ATI Technologies Inc. VisionTek Radeon X1550 Series -ATI Technologies Inc. WRESTLER 9802 -ATI Technologies Inc. XFX Radeon HD 4570 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Alex Mohr GL Hijacker! -Brian Paul Mesa X11 -Gallium -Humper -Humper Chromium -Humper Chromium -Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com -Imagination Technologies PowerVR SGX545 -Imagination Technologies PowerVR SGX545 -Intel -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com -Intel 4 Series Internal -Intel 845G -Intel 855GM -Intel 865G -Intel 915G -Intel 915GM -Intel 945G -Intel 945GM -Intel 950 -Intel 965 -Intel 965 -Intel 965 -Intel Bear Lake -Intel Broadwater -Intel Brookdale -Intel Cantiga -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series -Intel Eaglelake -Intel G33 -Intel G41 -Intel G45 -Intel Graphics Media HD -Intel Graphics Media HD -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics 2000 -Intel HD Graphics 2000 -Intel HD Graphics 3000 -Intel HD Graphics 3000 -Intel HD Graphics 4000 -Intel HD Graphics 4000 -Intel Inc. Intel GMA 950 OpenGL Engine -Intel Inc. Intel GMA 950 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics OpenGL Engine -Intel Intel 845G -Intel Intel 845G -Intel Intel 855GM -Intel Intel 855GM -Intel Intel 865G -Intel Intel 865G -Intel Intel 915G -Intel Intel 915G -Intel Intel 915GM -Intel Intel 915GM -Intel Intel 945G -Intel Intel 945G -Intel Intel 945GM -Intel Intel 945GM -Intel Intel 965/963 Graphics Media Accelerator -Intel Intel 965/963 Graphics Media Accelerator -Intel Intel Bear Lake B -Intel Intel Bear Lake B -Intel Intel Broadwater G -Intel Intel Brookdale-G -Intel Intel Cantiga -Intel Intel Cantiga -Intel Intel Eaglelake -Intel Intel Eaglelake -Intel Intel Grantsdale-G -Intel Intel Grantsdale-G -Intel Intel Iris Pro Graphics 5200 -Intel Intel Montara-GM -Intel Intel Pineview Platform -Intel Intel Pineview Platform -Intel Intel Springdale-G -Intel Intel(R) HD Graphics Family -Intel Intel(R) 4 Series Internal Chipset -Intel Intel(R) 4 Series Internal Chipset -Intel Intel(R) B43 Express Chipset -Intel Intel(R) B43 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) -Intel Intel(R) G41 Express Chipset v2 -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43/G41 Express Chipset -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics 100 -Intel Intel(R) HD Graphics 2000 -Intel Intel(R) HD Graphics 2000 -Intel Intel(R) HD Graphics 2500 -Intel Intel(R) HD Graphics 2500 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4400 -Intel Intel(R) HD Graphics 4600 -Intel Intel(R) HD Graphics 4600 -Intel Intel(R) HD Graphics 5000 -Intel Intel(R) HD Graphics BR-1004-01Y1 -Intel Intel(R) HD Graphics Family -Intel Intel(R) HD Graphics Family -Intel Intel(R) HD Graphics P3000 -Intel Intel(R) HD Graphics P4000 -Intel Intel(R) Q45/Q43 Express Chipset -Intel Intel(R) Q45/Q43 Express Chipset -Intel Iris OpenGL Graphics Engine -Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family -Intel Mobile Intel(R) 4 Series Express Chipset Family -Intel Mobile Intel(R) 4 Series Express Chipset Family v2 -Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) -Intel Mobile Intel(R) HD Graphics -Intel Mobile Intel(R) HD Graphics -Intel Montara -Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) IGD -Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Intel Pineview -Intel Q45/Q43 -Intel Royal BNA Driver -Intel Springdale -Intel X3100 -Intel X3100 -Matrox Graphics Inc. Matrox ICD for M-Series -Matrox Graphics Inc. Matrox G400 -Matrox Graphics Inc. Matrox ICD for Parhelia -Mesa -Mesa -Mesa Project Software Rasterizer -Mesa project: www.mesa3d.org Mesa GLX Indirect -NVIDIA 205 -NVIDIA 210 -NVIDIA 210 -NVIDIA 310 -NVIDIA 310 -NVIDIA 310 -NVIDIA 310M -NVIDIA 310M -NVIDIA 315 -NVIDIA 315M -NVIDIA 315M -NVIDIA 320M -NVIDIA 320M -NVIDIA 405 -NVIDIA 410 -NVIDIA 510 -NVIDIA 610M -NVIDIA Corporation /PCI/SSE2 -NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com -NVIDIA Corporation C51/PCI/SSE2/3DNOW! -NVIDIA Corporation C51G/PCI/SSE2/3DNOW! -NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! -NVIDIA Corporation D14P1-30/PCIe/SSE2 -NVIDIA Corporation D9M-20/PCI/SSE2 -NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! -NVIDIA Corporation G72/PCI/SSE2/3DNOW! -NVIDIA Corporation G73/AGP/SSE2/3DNOW! -NVIDIA Corporation G73/PCI/SSE2/3DNOW! -NVIDIA Corporation G84-50/PCI/SSE2 -NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! -NVIDIA Corporation GK106/PCIe/SSE2 -NVIDIA Corporation GRID K2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce 205/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 310/PCI/SSE2 -NVIDIA Corporation GeForce 310/PCI/SSE2 -NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 310/PCIe/SSE2 -NVIDIA Corporation GeForce 310/PCIe/SSE2 -NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 310M/PCI/SSE2 -NVIDIA Corporation GeForce 310M/PCI/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 315/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCIe/SSE2 -NVIDIA Corporation GeForce 315M/PCIe/SSE2 -NVIDIA Corporation GeForce 320M/PCI/SSE2 -NVIDIA Corporation GeForce 320M/PCI/SSE2 -NVIDIA Corporation GeForce 320M/integrated/SSE2 -NVIDIA Corporation GeForce 405/PCI/SSE2 -NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 405/PCIe/SSE2 -NVIDIA Corporation GeForce 405/PCIe/SSE2 -NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 410M/PCI/SSE2 -NVIDIA Corporation GeForce 410M/PCI/SSE2 -NVIDIA Corporation GeForce 410M/PCIe/SSE2 -NVIDIA Corporation GeForce 410M/PCIe/SSE2 -NVIDIA Corporation GeForce 505/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCI/SSE2 -NVIDIA Corporation GeForce 510/PCI/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 605/PCI/SSE2 -NVIDIA Corporation GeForce 605/PCIe/SSE2 -NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 610/PCIe/SSE2 -NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/PCI/SSE2 -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/integrated/SSE2 -NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 610M/PCI/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 615/PCIe/SSE2 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150/integrated/SSE2 -NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/AGP/SSE2 -NVIDIA Corporation GeForce 6200/AGP/SSE2 -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/PCI/SSE2 -NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/PCIe/SSE2 -NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6500/PCI/SSE2 -NVIDIA Corporation GeForce 6500/PCI/SSE2 -NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6500/PCIe/SSE2 -NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/AGP/SSE2 -NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/PCI/SSE2 -NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/PCIe/SSE2 -NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 -NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 -NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 -NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800/AGP/SSE2 -NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800/PCI/SSE2 -NVIDIA Corporation GeForce 6800/PCIe/SSE2 -NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 710A/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/PCI/SSE2 -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/integrated/SSE2 -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M G/integrated/SSE2 -NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300/PCI/SSE2 -NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300/integrated/SSE2 -NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 -NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 8400/PCI/SSE2 -NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400/PCIe/SSE2 -NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100/integrated/SSE2 -NVIDIA Corporation GeForce 9100/integrated/SSE2 -NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100M G/integrated/SSE2 -NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/PCI/SSE2 -NVIDIA Corporation GeForce 9200/PCI/SSE2 -NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/integrated/SSE2 -NVIDIA Corporation GeForce 9200/integrated/SSE2 -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300/PCI/SSE2 -NVIDIA Corporation GeForce 9300/integrated/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9400/PCI/SSE2 -NVIDIA Corporation GeForce 9400/integrated/SSE2 -NVIDIA Corporation GeForce 9400/integrated/SSE2 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 -NVIDIA Corporation GeForce 9400M G/integrated/SSE2 -NVIDIA Corporation GeForce 9400M/PCI/SSE2 -NVIDIA Corporation GeForce 9400M/integrated/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 S/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 -NVIDIA Corporation GeForce FX 5100/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200/PCI/SSE2 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5500/PCI/SSE2 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5600/AGP/SSE2 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 -NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 -NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce G 103M/PCI/SSE2 -NVIDIA Corporation GeForce G 103M/PCI/SSE2 -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 -NVIDIA Corporation GeForce G 105M/PCI/SSE2 -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 -NVIDIA Corporation GeForce G 110M/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce G100/PCIe/SSE2 -NVIDIA Corporation GeForce G100/PCIe/SSE2 -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G102M/PCI/SSE2 -NVIDIA Corporation GeForce G102M/PCI/SSE2 -NVIDIA Corporation GeForce G102M/integrated/SSE2 -NVIDIA Corporation GeForce G102M/integrated/SSE2 -NVIDIA Corporation GeForce G105M/PCI/SSE2 -NVIDIA Corporation GeForce G105M/PCI/SSE2 -NVIDIA Corporation GeForce G105M/PCIe/SSE2 -NVIDIA Corporation GeForce G105M/PCIe/SSE2 -NVIDIA Corporation GeForce G200/PCI/SSE2 -NVIDIA Corporation GeForce G200/PCI/SSE2 -NVIDIA Corporation GeForce G200/integrated/SSE2 -NVIDIA Corporation GeForce G205M/PCI/SSE2 -NVIDIA Corporation GeForce G205M/integrated/SSE2 -NVIDIA Corporation GeForce G205M/integrated/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G210M/PCI/SSE2 -NVIDIA Corporation GeForce G210M/PCI/SSE2 -NVIDIA Corporation GeForce G210M/PCIe/SSE2 -NVIDIA Corporation GeForce G210M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCI/SSE2 -NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCI/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 130M/PCI/SSE2 -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 140/PCI/SSE2 -NVIDIA Corporation GeForce GT 140/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCI/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 230M/PCI/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCI/SSE2 -NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 320M/PCI/SSE2 -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 325M/PCI/SSE2 -NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCI/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCI/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 340/PCI/SSE2 -NVIDIA Corporation GeForce GT 340/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCI/SSE2 -NVIDIA Corporation GeForce GT 420/PCI/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCI/SSE2 -NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 435M/PCI/SSE2 -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCI/SSE2 -NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCI/SSE2 -NVIDIA Corporation GeForce GT 530/PCI/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCI/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 555M/PCI/SSE2 -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620/PCI/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620M/PCI/SSE2 -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 630M/PCI/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 635M/PCI/SSE2 -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 -NVIDIA Corporation GeForce GT620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT625M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 150/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 280/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/PCI/SSE2 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6200/PCI/SSE2 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6400/PCI/SSE2 -NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 -NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 -NVIDIA Corporation GeForce Go 6600/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7700/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 -NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 -NVIDIA Corporation GeForce2 GTS/AGP/SSE2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce2 MX/PCI/SSE2 -NVIDIA Corporation GeForce3/AGP/SSE2 -NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 -NVIDIA Corporation ION LE/PCI/SSE2 -NVIDIA Corporation ION LE/integrated/SSE2 -NVIDIA Corporation ION LE/integrated/SSE2 -NVIDIA Corporation ION/PCI/SSE2 -NVIDIA Corporation ION/PCIe/SSE2 -NVIDIA Corporation ION/PCIe/SSE2 -NVIDIA Corporation ION/PCIe/SSE2/3DNOW! -NVIDIA Corporation ION/integrated/SSE2 -NVIDIA Corporation ION/integrated/SSE2 -NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! -NVIDIA Corporation MCP7A-O/PCI/SSE2 -NVIDIA Corporation MCP7A-P/PCI/SSE2 -NVIDIA Corporation N10P-GV2/PCI/SSE2 -NVIDIA Corporation N11M-GE2/PCI/SSE2 -NVIDIA Corporation N11M-GE2/PCI/SSE2 -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 -NVIDIA Corporation NB9M-GE1/PCI/SSE2 -NVIDIA Corporation NB9M-GS/PCI/SSE2 -NVIDIA Corporation NV17/AGP/SSE2 -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine -NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine -NVIDIA Corporation NVS 2100M/PCI/SSE2 -NVIDIA Corporation NVS 2100M/PCIe/SSE2 -NVIDIA Corporation NVS 2100M/PCIe/SSE2 -NVIDIA Corporation NVS 300/PCI/SSE2 -NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! -NVIDIA Corporation NVS 300/PCIe/SSE2 -NVIDIA Corporation NVS 310/PCIe/SSE2 -NVIDIA Corporation NVS 310/PCIe/SSE2 -NVIDIA Corporation NVS 3100M/PCI/SSE2 -NVIDIA Corporation NVS 3100M/PCI/SSE2 -NVIDIA Corporation NVS 3100M/PCIe/SSE2 -NVIDIA Corporation NVS 3100M/PCIe/SSE2 -NVIDIA Corporation NVS 315/PCIe/SSE2 -NVIDIA Corporation NVS 4200M/PCI/SSE2 -NVIDIA Corporation NVS 4200M/PCI/SSE2 -NVIDIA Corporation NVS 4200M/PCIe/SSE2 -NVIDIA Corporation NVS 4200M/PCIe/SSE2 -NVIDIA Corporation NVS 510/PCIe/SSE2 -NVIDIA Corporation NVS 510/PCIe/SSE2 -NVIDIA Corporation NVS 5100M/PCI/SSE2 -NVIDIA Corporation NVS 5100M/PCIe/SSE2 -NVIDIA Corporation NVS 5100M/PCIe/SSE2 -NVIDIA Corporation NVS 5200M/PCI/SSE2 -NVIDIA Corporation NVS 5200M/PCIe/SSE2 -NVIDIA Corporation NVS 5200M/PCIe/SSE2 -NVIDIA Corporation NVS 5400M/PCIe/SSE2 -NVIDIA Corporation NVS 5400M/PCIe/SSE2 -NVIDIA Corporation Quadro 1000M/PCI/SSE2 -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 -NVIDIA Corporation Quadro 1100M/PCIe/SSE2 -NVIDIA Corporation Quadro 2000 D/PCI/SSE2 -NVIDIA Corporation Quadro 2000/PCI/SSE2 -NVIDIA Corporation Quadro 2000/PCIe/SSE2 -NVIDIA Corporation Quadro 2000/PCIe/SSE2 -NVIDIA Corporation Quadro 2000D/PCIe/SSE2 -NVIDIA Corporation Quadro 2000M/PCI/SSE2 -NVIDIA Corporation Quadro 2000M/PCIe/SSE2 -NVIDIA Corporation Quadro 3000M/PCI/SSE2 -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro 400/PCIe/SSE2 -NVIDIA Corporation Quadro 4000/PCI/SSE2 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 -NVIDIA Corporation Quadro 4000M/PCIe/SSE2 -NVIDIA Corporation Quadro 410/PCIe/SSE2 -NVIDIA Corporation Quadro 5000/PCI/SSE2 -NVIDIA Corporation Quadro 5000/PCIe/SSE2 -NVIDIA Corporation Quadro 5000M/PCI/SSE2 -NVIDIA Corporation Quadro 5000M/PCIe/SSE2 -NVIDIA Corporation Quadro 5010M/PCI/SSE2 -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCI/SSE2 -NVIDIA Corporation Quadro 600/PCI/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro 6000/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1000/AGP/SSE2 -NVIDIA Corporation Quadro FX 1100/AGP/SSE2 -NVIDIA Corporation Quadro FX 1300/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1500/PCI/SSE2 -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCI/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1800/PCI/SSE2 -NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2000/AGP/SSE2 -NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3000/AGP/SSE2 -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3500/PCI/SSE2 -NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 350M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 360M/PCI/SSE2 -NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370/PCI/SSE2 -NVIDIA Corporation Quadro FX 370/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3700/PCI/SSE2 -NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370M/PCI/SSE2 -NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 380/PCI/SSE2 -NVIDIA Corporation Quadro FX 380/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3800/PCI/SSE2 -NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380M/PCI/SSE2 -NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4500/PCI/SSE2 -NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4800/PCI/SSE2 -NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 500/AGP/SSE2 -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 -NVIDIA Corporation Quadro FX 540/PCI/SSE2 -NVIDIA Corporation Quadro FX 540/PCIe/SSE2 -NVIDIA Corporation Quadro FX 550/PCI/SSE2 -NVIDIA Corporation Quadro FX 550/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5500/PCI/SSE2 -NVIDIA Corporation Quadro FX 560/PCI/SSE2 -NVIDIA Corporation Quadro FX 560/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 -NVIDIA Corporation Quadro FX 570/PCI/SSE2 -NVIDIA Corporation Quadro FX 570/PCIe/SSE2 -NVIDIA Corporation Quadro FX 570M/PCI/SSE2 -NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 580/PCI/SSE2 -NVIDIA Corporation Quadro FX 580/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 770M/PCI/SSE2 -NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 880M/PCI/SSE2 -NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX Go700/AGP/SSE2 -NVIDIA Corporation Quadro K1000/PCIe/SSE2 -NVIDIA Corporation Quadro K1000M/PCIe/SSE2 -NVIDIA Corporation Quadro K2000/PCIe/SSE2 -NVIDIA Corporation Quadro K2000/PCIe/SSE2 -NVIDIA Corporation Quadro K2000D/PCIe/SSE2 -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 -NVIDIA Corporation Quadro K3000M/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000M/PCIe/SSE2 -NVIDIA Corporation Quadro K5000/PCIe/SSE2 -NVIDIA Corporation Quadro K5000M/PCIe/SSE2 -NVIDIA Corporation Quadro K600/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 -NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 -NVIDIA Corporation Quadro NVS 285/PCI/SSE2 -NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 290/PCI/SSE2 -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 295/PCI/SSE2 -NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 420/PCI/SSE2 -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 -NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 -NVIDIA Corporation Quadro NVS/AGP/SSE2 -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 -NVIDIA Corporation Quadro2 MXR/AGP/SSE2 -NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 -NVIDIA Corporation RIVA TNT2/AGP/SSE2 -NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! -NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 -NVIDIA Corporation nForce 750a SLI/PCI/SSE2 -NVIDIA Corporation nForce 750a SLI/integrated/SSE2 -NVIDIA Corporation nForce 760i SLI/integrated/SSE2 -NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 -NVIDIA Corporation unknown board/AGP/SSE2 -NVIDIA Corporation unknown board/PCI/SSE2 -NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! -NVIDIA Corporation unknown board/PCIe/SSE2 -NVIDIA D9M -NVIDIA G 103M -NVIDIA G 105M -NVIDIA G 110M -NVIDIA G 120M -NVIDIA G 200 -NVIDIA G 205M -NVIDIA G 210 -NVIDIA G 310M -NVIDIA G 320M -NVIDIA G 405 -NVIDIA G 410M -NVIDIA G 610M -NVIDIA G100 -NVIDIA G100M -NVIDIA G102M -NVIDIA G103M -NVIDIA G105M -NVIDIA G200 -NVIDIA G210 -NVIDIA G210M -NVIDIA G73 -NVIDIA G84 -NVIDIA G84 -NVIDIA G92 -NVIDIA G94 -NVIDIA GT 120 -NVIDIA GT 120 -NVIDIA GT 120M -NVIDIA GT 130 -NVIDIA GT 130 -NVIDIA GT 130 -NVIDIA GT 130M -NVIDIA GT 140 -NVIDIA GT 140M -NVIDIA GT 150 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220M -NVIDIA GT 230 -NVIDIA GT 230 -NVIDIA GT 230M -NVIDIA GT 240 -NVIDIA GT 240 -NVIDIA GT 240 -NVIDIA GT 240M -NVIDIA GT 260M -NVIDIA GT 320 -NVIDIA GT 320M -NVIDIA GT 320M -NVIDIA GT 325M -NVIDIA GT 330 -NVIDIA GT 330 -NVIDIA GT 330 -NVIDIA GT 330M -NVIDIA GT 330M -NVIDIA GT 335M -NVIDIA GT 340 -NVIDIA GT 340M -NVIDIA GT 415M -NVIDIA GT 420 -NVIDIA GT 420M -NVIDIA GT 425M -NVIDIA GT 430 -NVIDIA GT 430M -NVIDIA GT 435M -NVIDIA GT 440 -NVIDIA GT 440M -NVIDIA GT 445M -NVIDIA GT 450 -NVIDIA GT 520 -NVIDIA GT 520 -NVIDIA GT 520M -NVIDIA GT 525M -NVIDIA GT 530M -NVIDIA GT 540 -NVIDIA GT 540M -NVIDIA GT 550 -NVIDIA GT 550M -NVIDIA GT 555M -NVIDIA GT 610 -NVIDIA GT 620 -NVIDIA GT 620M -NVIDIA GT 630 -NVIDIA GT 630M -NVIDIA GT 635M -NVIDIA GT 640 -NVIDIA GT 640M -NVIDIA GT 650 -NVIDIA GT 650M -NVIDIA GT 650M -NVIDIA GTS 160M -NVIDIA GTS 240 -NVIDIA GTS 240 -NVIDIA GTS 250 -NVIDIA GTS 350M -NVIDIA GTS 360 -NVIDIA GTS 360M -NVIDIA GTS 450 -NVIDIA GTX 260 -NVIDIA GTX 270 -NVIDIA GTX 275 -NVIDIA GTX 280 -NVIDIA GTX 285 -NVIDIA GTX 290 -NVIDIA GTX 295 -NVIDIA GTX 460 -NVIDIA GTX 460M -NVIDIA GTX 465 -NVIDIA GTX 470 -NVIDIA GTX 470M -NVIDIA GTX 480 -NVIDIA GTX 480M -NVIDIA GTX 485M -NVIDIA GTX 550 -NVIDIA GTX 560 -NVIDIA GTX 560 -NVIDIA GTX 560 -NVIDIA GTX 560 Ti -NVIDIA GTX 570 -NVIDIA GTX 580 -NVIDIA GTX 580M -NVIDIA GTX 590 -NVIDIA GTX 650 -NVIDIA GTX 660 -NVIDIA GTX 660 -NVIDIA GTX 670 -NVIDIA GTX 670 -NVIDIA GTX 670M -NVIDIA GTX 675M -NVIDIA GTX 675M -NVIDIA GTX 680 -NVIDIA GTX 680 -NVIDIA GTX 680M -NVIDIA GTX 690 -NVIDIA GTX 770 -NVIDIA GTX 770 -NVIDIA GTX TITAN -NVIDIA GeForce 2 -NVIDIA GeForce 3 -NVIDIA GeForce 4 -NVIDIA GeForce 4 Go -NVIDIA GeForce 4 MX -NVIDIA GeForce 4 Ti -NVIDIA GeForce 6100 -NVIDIA GeForce 6100 -NVIDIA GeForce 6200 -NVIDIA GeForce 6200 -NVIDIA GeForce 6500 -NVIDIA GeForce 6600 -NVIDIA GeForce 6700 -NVIDIA GeForce 6800 -NVIDIA GeForce 7000 -NVIDIA GeForce 7000M -NVIDIA GeForce 7100 -NVIDIA GeForce 7300 -NVIDIA GeForce 7300 -NVIDIA GeForce 7500 -NVIDIA GeForce 7600 -NVIDIA GeForce 7600 -NVIDIA GeForce 7800 -NVIDIA GeForce 7800 -NVIDIA GeForce 7900 -NVIDIA GeForce 7900 -NVIDIA GeForce 8100 -NVIDIA GeForce 8200 -NVIDIA GeForce 8200M -NVIDIA GeForce 8300 -NVIDIA GeForce 8300 -NVIDIA GeForce 8400 -NVIDIA GeForce 8400 -NVIDIA GeForce 8400M -NVIDIA GeForce 8400M -NVIDIA GeForce 8500 -NVIDIA GeForce 8500 -NVIDIA GeForce 8600 -NVIDIA GeForce 8600M -NVIDIA GeForce 8600M -NVIDIA GeForce 8700 -NVIDIA GeForce 8700M -NVIDIA GeForce 8800 -NVIDIA GeForce 8800M -NVIDIA GeForce 9100 -NVIDIA GeForce 9100M -NVIDIA GeForce 9200 -NVIDIA GeForce 9200 -NVIDIA GeForce 9200M -NVIDIA GeForce 9300 -NVIDIA GeForce 9300 -NVIDIA GeForce 9300M -NVIDIA GeForce 9300M -NVIDIA GeForce 9400 -NVIDIA GeForce 9400 -NVIDIA GeForce 9400M -NVIDIA GeForce 9400M -NVIDIA GeForce 9500 -NVIDIA GeForce 9500M -NVIDIA GeForce 9600 -NVIDIA GeForce 9600 -NVIDIA GeForce 9600M -NVIDIA GeForce 9600M -NVIDIA GeForce 9700M -NVIDIA GeForce 9800 -NVIDIA GeForce 9800M -NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100 -NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5700 -NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7900 -NVIDIA GeForce PCX -NVIDIA Generic -NVIDIA ION -NVIDIA MCP61 -NVIDIA NV34 -NVIDIA PCI -NVIDIA Quadro 2000 -NVIDIA Quadro 2000 M/D -NVIDIA Quadro 2000 M/D -NVIDIA Quadro 3000M -NVIDIA Quadro 400 -NVIDIA Quadro 4000 -NVIDIA Quadro 4000 -NVIDIA Quadro 4000M -NVIDIA Quadro 50x0 M -NVIDIA Quadro 600 -NVIDIA Quadro 6000 -NVIDIA Quadro FX -NVIDIA Quadro FX 1500M -NVIDIA Quadro FX 1800 -NVIDIA Quadro FX 2500M -NVIDIA Quadro FX 2700M -NVIDIA Quadro FX 2800M -NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 550 -NVIDIA Quadro FX 770M -NVIDIA Quadro FX 880M -NVIDIA Quadro NVS -NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 4200M -NVIDIA Quadro2 -NVIDIA nForce -Oracle VirtualBox Graphics -Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine -PowerVR SGX545 -S3 -S3 Graphics K8M800/MMX/K3D -S3 Graphics KM400/KN400/MMX/SSE -S3 Graphics P8M800/MMX/SSE -S3 Graphics Unknown Device/MMX/SSE -S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE -S3 Graphics, Incorporated ProSavage/Twister -S3 Graphics, Incorporated S3 Graphics Chrome9 HC -S3 Graphics, Incorporated S3 Graphics DeltaChrome -S3 Graphics, Incorporated VIA Chrome9 HC IGP -S3 Graphics, Incorporated VIA Chrome9 HC IGP -S3 Graphics, Incorporated VIA Chrome9 HC3 IGP -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP -SiS -SiS 3D-Analyze v2.3 - http://www.tommti-systems.com -SiS 650/M650 VGA -SiS 650/M650 VGA / MMX/SSE2 /AGP -SiS 661 VGA -SiS 662 VGA -SiS 760 VGA -SiS 761GX VGA -SiS Mirage Graphics3 -SiS Mirage Graphics3 -SiS Xabre VGA -Tungsten Graphics, Inc Mesa DRI Intel(R) 845G -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe -X.Org Gallium 0.4 on AMD ARUBA -X.Org Gallium 0.4 on AMD ARUBA -X.Org Gallium 0.4 on AMD BARTS -X.Org Gallium 0.4 on AMD BARTS -X.Org Gallium 0.4 on AMD CAICOS -X.Org Gallium 0.4 on AMD CAPE VERDE -X.Org Gallium 0.4 on AMD CEDAR -X.Org Gallium 0.4 on AMD CYPRESS -X.Org Gallium 0.4 on AMD JUNIPER -X.Org Gallium 0.4 on AMD PALM -X.Org Gallium 0.4 on AMD PALM -X.Org Gallium 0.4 on AMD REDWOOD -X.Org Gallium 0.4 on AMD REDWOOD -X.Org Gallium 0.4 on AMD RS780 -X.Org Gallium 0.4 on AMD RS780 -X.Org Gallium 0.4 on AMD RS880 -X.Org Gallium 0.4 on AMD RV610 -X.Org Gallium 0.4 on AMD RV610 -X.Org Gallium 0.4 on AMD RV620 -X.Org Gallium 0.4 on AMD RV630 -X.Org Gallium 0.4 on AMD RV635 -X.Org Gallium 0.4 on AMD RV670 -X.Org Gallium 0.4 on AMD RV710 -X.Org Gallium 0.4 on AMD RV710 -X.Org Gallium 0.4 on AMD RV730 -X.Org Gallium 0.4 on AMD RV730 -X.Org Gallium 0.4 on AMD RV740 -X.Org Gallium 0.4 on AMD RV770 -X.Org Gallium 0.4 on AMD SUMO -X.Org Gallium 0.4 on AMD SUMO -X.Org Gallium 0.4 on AMD SUMO2 -X.Org Gallium 0.4 on AMD TURKS -X.Org R300 Project Gallium 0.4 on ATI R350 -X.Org R300 Project Gallium 0.4 on ATI R580 -X.Org R300 Project Gallium 0.4 on ATI RC410 -X.Org R300 Project Gallium 0.4 on ATI RS480 -X.Org R300 Project Gallium 0.4 on ATI RS480 -X.Org R300 Project Gallium 0.4 on ATI RS482 -X.Org R300 Project Gallium 0.4 on ATI RS600 -X.Org R300 Project Gallium 0.4 on ATI RS690 -X.Org R300 Project Gallium 0.4 on ATI RV350 -X.Org R300 Project Gallium 0.4 on ATI RV350 -X.Org R300 Project Gallium 0.4 on ATI RV370 -X.Org R300 Project Gallium 0.4 on ATI RV380 -X.Org R300 Project Gallium 0.4 on ATI RV410 -X.Org R300 Project Gallium 0.4 on ATI RV515 -X.Org R300 Project Gallium 0.4 on ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV570 -XGI Volari V3 -http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION/4 TMUs -nouveau Gallium 0.4 on NV34 -nouveau Gallium 0.4 on NV34 -nouveau Gallium 0.4 on NV42 -nouveau Gallium 0.4 on NV42 -nouveau Gallium 0.4 on NV44 -nouveau Gallium 0.4 on NV44 -nouveau Gallium 0.4 on NV46 -nouveau Gallium 0.4 on NV49 -nouveau Gallium 0.4 on NV4A -nouveau Gallium 0.4 on NV4A -nouveau Gallium 0.4 on NV4B -nouveau Gallium 0.4 on NV4B -nouveau Gallium 0.4 on NV4C -nouveau Gallium 0.4 on NV4C -nouveau Gallium 0.4 on NV4E -nouveau Gallium 0.4 on NV50 -nouveau Gallium 0.4 on NV63 -nouveau Gallium 0.4 on NV67 -nouveau Gallium 0.4 on NV84 -nouveau Gallium 0.4 on NV84 -nouveau Gallium 0.4 on NV86 -nouveau Gallium 0.4 on NV86 -nouveau Gallium 0.4 on NV92 -nouveau Gallium 0.4 on NV92 -nouveau Gallium 0.4 on NV94 -nouveau Gallium 0.4 on NV94 -nouveau Gallium 0.4 on NV96 -nouveau Gallium 0.4 on NV96 -nouveau Gallium 0.4 on NV98 -nouveau Gallium 0.4 on NV98 -nouveau Gallium 0.4 on NVA0 -nouveau Gallium 0.4 on NVA0 -nouveau Gallium 0.4 on NVA3 -nouveau Gallium 0.4 on NVA3 -nouveau Gallium 0.4 on NVA5 -nouveau Gallium 0.4 on NVA5 -nouveau Gallium 0.4 on NVA8 -nouveau Gallium 0.4 on NVA8 -nouveau Gallium 0.4 on NVAA -nouveau Gallium 0.4 on NVAA -nouveau Gallium 0.4 on NVAC -nouveau Gallium 0.4 on NVAC -nouveau Gallium 0.4 on NVAF -nouveau Gallium 0.4 on NVC0 -nouveau Gallium 0.4 on NVC0 -nouveau Gallium 0.4 on NVC1 -nouveau Gallium 0.4 on NVC1 -nouveau Gallium 0.4 on NVC3 -nouveau Gallium 0.4 on NVC4 -nouveau Gallium 0.4 on NVC4 -nouveau Gallium 0.4 on NVCE -nouveau Gallium 0.4 on NVCE -nouveau Gallium 0.4 on NVCF -nouveau Gallium 0.4 on NVCF -nouveau Gallium 0.4 on NVD9 -nouveau Gallium 0.4 on NVD9 -nouveau Gallium 0.4 on NVE4 -nouveau Gallium 0.4 on NVE6 -nouveau Gallium 0.4 on NVE7 -nouveau Gallium 0.4 on NVE7 diff --git a/indra/newview/tests/gpus_unmatched.txt b/indra/newview/tests/gpus_unmatched.txt deleted file mode 100644 index 083f29aaa0..0000000000 --- a/indra/newview/tests/gpus_unmatched.txt +++ /dev/null @@ -1,9 +0,0 @@ -ATI NO MATCH -ATI Technologies NO MATCH -ATI Technologies Inc. NO MATCH -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH -ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH -ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH -Intel NO MATCH -NVIDIA Corporation /PCI/SSE2 NO MATCH -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp index 5d9c2f718b..ff4a4daf6d 100644 --- a/indra/newview/tests/lldir_stub.cpp +++ b/indra/newview/tests/lldir_stub.cpp @@ -28,7 +28,7 @@ LLDir::LLDir() {} LLDir::~LLDir() {} -BOOL LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return true; } +S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return 1; } void LLDir::setChatLogsDir(const std::string &path) {} void LLDir::setPerAccountChatLogsDir(const std::string &) {} void LLDir::updatePerAccountChatLogsDir() {} diff --git a/indra/newview/tests/llglslshader_stub.cpp b/indra/newview/tests/llglslshader_stub.cpp deleted file mode 100644 index 537434a6d8..0000000000 --- a/indra/newview/tests/llglslshader_stub.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file llglslshader_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&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 "llglslshader.h" - -void LLGLSLShader::uniform1f(const std::string& uniform, F32 num) -{ -} - -void LLGLSLShader::uniform3fv(const std::string& uniform, U32 count, const GLfloat *v) -{ -} - -void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v) -{ -} diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index c8fa2fbd6f..9f3d7454ad 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -27,7 +27,6 @@ #include "linden_common.h" #include "../test/lltut.h" -#if 0 #include "../llremoteparcelrequest.h" @@ -40,16 +39,6 @@ namespace { const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111"); } -LLCurl::Responder::Responder() { } -LLCurl::Responder::~Responder() { } -void LLCurl::Responder::httpFailure() { } -void LLCurl::Responder::httpSuccess() { } -void LLCurl::Responder::httpCompleted() { } -void LLCurl::Responder::failureResult(S32 status, const std::string& reason, const LLSD& content) { } -void LLCurl::Responder::successResult(const LLSD& content) { } -void LLCurl::Responder::completeResult(S32 status, const std::string& reason, const LLSD& content) { } -std::string LLCurl::Responder::dumpResponse() const { return "(failure)"; } -void LLCurl::Responder::completedRaw(LLChannelDescriptors const &,std::shared_ptr<LLBufferArray> const &) { } void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { } void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { } void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { } @@ -136,4 +125,3 @@ namespace tut processor.processParcelInfoReply(gMessageSystem, NULL); } } -#endif diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index f4ee15319e..acbadbc85a 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -773,7 +773,7 @@ namespace tut LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); LLXORCipher cipher2(unique_id, sizeof(unique_id)); cipher2.encrypt(&binary_data[0], 16); - std::ofstream temp_file("sechandler_settings.tmp", std::ofstream::binary); + llofstream temp_file("sechandler_settings.tmp", std::ofstream::binary); temp_file.write((const char *)&binary_data[0], binary_data.size()); temp_file.close(); @@ -846,7 +846,7 @@ namespace tut // rewrite the initial file to verify reloads handler = NULL; - std::ofstream temp_file2("sechandler_settings.tmp", std::ofstream::binary); + llofstream temp_file2("sechandler_settings.tmp", std::ofstream::binary); temp_file2.write((const char *)&binary_data[0], binary_data.size()); temp_file2.close(); diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp index 3ff38ea372..bf23538201 100644 --- a/indra/newview/tests/llslurl_test.cpp +++ b/indra/newview/tests/llslurl_test.cpp @@ -147,10 +147,12 @@ namespace tut { slurlTest() { + LLGridManager::createInstance(); LLGridManager::getInstance()->initialize(std::string("")); } ~slurlTest() { + LLGridManager::deleteSingleton(); } }; diff --git a/indra/newview/tests/lltextureinfo_test.cpp b/indra/newview/tests/lltextureinfo_test.cpp index d491ce0f65..58451a1069 100644 --- a/indra/newview/tests/lltextureinfo_test.cpp +++ b/indra/newview/tests/lltextureinfo_test.cpp @@ -32,6 +32,13 @@ // Dependencies #include "../lltextureinfodetails.cpp" +#include "../llagent.h" +#include "../llappviewer.h" +#include "../llmeshrepository.h" +#include "../lltexturecache.h" +#include "../lltexturefetch.h" +#include "../llvocache.h" + // Tut header #include "../test/lltut.h" @@ -43,6 +50,39 @@ // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) // * A simulator for a class can be implemented here. Please comment and document thoroughly. +LLControlGroup gSavedSettings("Global"); + +void send_texture_stats_to_sim(const LLSD& texture_stats) {} + +LLAgent gAgent; +LLAgent::LLAgent() : mAgentAccess(nullptr) { } +LLAgent::~LLAgent() { } +LLViewerRegion* LLAgent::getRegion() const { return nullptr; } + +LLTextureCache* LLAppViewer::sTextureCache = nullptr; +LLTextureFetch* LLAppViewer::sTextureFetch = nullptr; + +U32 LLMeshRepository::sCacheReads = 0; +std::atomic<U32> LLMeshRepository::sCacheWrites = 0; + +S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit + +void LLTextureFetch::getStateStats(U32* cache_read, U32* cache_write, U32* res_wait) +{ + *cache_read = 0; + *cache_write = 0; + *res_wait = 0; +} + +LLVOCache::LLVOCache(bool read_only) : + mInitialized(false), + mReadOnly(read_only), + mNumEntries(0), + mCacheSize(1), + mEnabled(true) +{} + +LLVOCache::~LLVOCache() {} // End Stubbing // ------------------------------------------------------------------------------------------- @@ -89,7 +129,7 @@ namespace tut void textureinfo_object_t::test<1>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); ensure("have we crashed?", true); } @@ -98,7 +138,7 @@ namespace tut void textureinfo_object_t::test<2>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure(!tex_info.has(nonExistant)); @@ -109,7 +149,7 @@ namespace tut void textureinfo_object_t::test<3>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id, 200); @@ -122,7 +162,7 @@ namespace tut void textureinfo_object_t::test<4>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure_equals(tex_info.getRequestStartTime(nonExistant), 0); @@ -133,7 +173,7 @@ namespace tut void textureinfo_object_t::test<5>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure_equals(tex_info.getRequestCompleteTime(nonExistant), 0); @@ -144,7 +184,7 @@ namespace tut void textureinfo_object_t::test<6>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestSize(id, 600); @@ -157,7 +197,7 @@ namespace tut void textureinfo_object_t::test<7>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_HTTP); @@ -170,7 +210,7 @@ namespace tut void textureinfo_object_t::test<8>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_UDP); @@ -183,7 +223,7 @@ namespace tut void textureinfo_object_t::test<9>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestOffset(id, 1234); @@ -195,11 +235,13 @@ namespace tut template<> template<> void textureinfo_object_t::test<10>() { + skip("Test skipped due to use of LLTrace stats failing in test"); + LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; S32 requestSizeOneBits = requestSizeOne * 8; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); @@ -209,7 +251,7 @@ namespace tut tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); U32 requestStartTimeTwo = 100; - U32 requestEndTimeTwo = 500; + U64Microseconds requestEndTimeTwo(500); U32 requestSizeTwo = 2048; S32 requestSizeTwoBits = requestSizeTwo * 8; LLUUID id2("10e65d70-46fd-429f-841a-bf698e9424d4"); @@ -218,8 +260,9 @@ namespace tut tex_info.setRequestType(id2, LLTextureInfoDetails::REQUEST_TYPE_HTTP); tex_info.setRequestCompleteTimeAndLog(id2, requestEndTimeTwo); - S32 averageBitRate = ((requestSizeOneBits/(requestEndTimeOne - requestStartTimeOne)) + - (requestSizeTwoBits/(requestEndTimeTwo - requestStartTimeTwo))) / 2; + S32 averageBitRate = ((requestSizeOneBits / (S32(requestEndTimeOne.value()) - requestStartTimeOne)) + + (requestSizeTwoBits / (S32(requestEndTimeTwo.value()) - requestStartTimeTwo))) / + 2; S32 totalBytes = requestSizeOne + requestSizeTwo; @@ -234,10 +277,10 @@ namespace tut void textureinfo_object_t::test<11>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id1, requestStartTimeOne); @@ -246,7 +289,7 @@ namespace tut tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); tex_info.getAverages(); - tex_info.reset(); + tex_info.resetTextureStatistics(); LLSD results = tex_info.getAverages(); ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), 0); ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), 0); @@ -258,10 +301,10 @@ namespace tut void textureinfo_object_t::test<12>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id1, requestStartTimeOne); diff --git a/indra/newview/tests/lltexturestatsuploader_test.cpp b/indra/newview/tests/lltexturestatsuploader_test.cpp deleted file mode 100644 index 782a4892b9..0000000000 --- a/indra/newview/tests/lltexturestatsuploader_test.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file lltexturestatsuploader_test.cpp - * @author Si - * @date 2009-05-27 - * - * $LicenseInfo:firstyear=2006&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$ - */ - -// Precompiled header: almost always required for newview cpp files -#include "../llviewerprecompiledheaders.h" -// Class to test -#include "../lltexturestatsuploader.h" -// Dependencies - -// Tut header -#include "../test/lltut.h" - -// ------------------------------------------------------------------------------------------- -// Stubbing: Declarations required to link and run the class being tested -// Notes: -// * Add here stubbed implementation of the few classes and methods used in the class to be tested -// * Add as little as possible (let the link errors guide you) -// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) -// * A simulator for a class can be implemented here. Please comment and document thoroughly. - -#include "boost/intrusive_ptr.hpp" -void boost::intrusive_ptr_add_ref(LLCurl::Responder*){} -void boost::intrusive_ptr_release(LLCurl::Responder* p){} -const F32 HTTP_REQUEST_EXPIRY_SECS = 0.0f; - -static std::string most_recent_url; -static LLSD most_recent_body; - -void LLHTTPClient::post( - const std::string& url, - const LLSD& body, - ResponderPtr, - const LLSD& headers, - const F32 timeout) -{ - // set some sensor code - most_recent_url = url; - most_recent_body = body; - return; -} - -// End Stubbing -// ------------------------------------------------------------------------------------------- - -// ------------------------------------------------------------------------------------------- -// TUT -// ------------------------------------------------------------------------------------------- - -namespace tut -{ - // Test wrapper declarations - struct texturestatsuploader_test - { - // Constructor and destructor of the test wrapper - texturestatsuploader_test() - { - most_recent_url = "some sort of default text that should never match anything the tests are expecting!"; - LLSD blank_llsd; - most_recent_body = blank_llsd; - } - ~texturestatsuploader_test() - { - } - }; - - // Tut templating thingamagic: test group, object and test instance - typedef test_group<texturestatsuploader_test> texturestatsuploader_t; - typedef texturestatsuploader_t::object texturestatsuploader_object_t; - tut::texturestatsuploader_t tut_texturestatsuploader("LLTextureStatsUploader"); - - - // --------------------------------------------------------------------------------------- - // Test functions - // Notes: - // * Test as many as you possibly can without requiring a full blown simulation of everything - // * The tests are executed in sequence so the test instance state may change between calls - // * Remember that you cannot test private methods with tut - // --------------------------------------------------------------------------------------- - - // --------------------------------------------------------------------------------------- - // Test the LLTextureInfo - // --------------------------------------------------------------------------------------- - - - // Test instantiation - template<> template<> - void texturestatsuploader_object_t::test<1>() - { - LLTextureStatsUploader tsu; - LL_INFOS() << &tsu << LL_ENDL; - ensure("have we crashed?", true); - } - - // does it call out to the provided url if we ask it to? - template<> template<> - void texturestatsuploader_object_t::test<2>() - { - LLTextureStatsUploader tsu; - std::string url = "http://blahblahblah"; - LLSD texture_stats; - tsu.uploadStatsToSimulator(url, texture_stats); - ensure_equals("did the right url get called?", most_recent_url, url); - ensure_equals("did the right body get sent?", most_recent_body, texture_stats); - } - - // does it not call out to the provided url if we send it an ungranted cap? - template<> template<> - void texturestatsuploader_object_t::test<3>() - { - LLTextureStatsUploader tsu; - - // this url left intentionally blank to mirror - // not getting a cap in the caller. - std::string url_for_ungranted_cap = ""; - - LLSD texture_stats; - std::string most_recent_url_before_test = most_recent_url; - tsu.uploadStatsToSimulator(url_for_ungranted_cap, texture_stats); - - ensure_equals("hopefully no url got called!", most_recent_url, most_recent_url_before_test); - } - - // does it call out if the data is empty? - // should it even do that? -} - diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp index 8049e67fc5..a78235c5f7 100644 --- a/indra/newview/tests/llversioninfo_test.cpp +++ b/indra/newview/tests/llversioninfo_test.cpp @@ -29,6 +29,8 @@ #include "../llversioninfo.h" +#include "llversioninfovars.h" + #include <iostream> // LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index 1cbb8b50eb..6190d7052b 100644 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -175,6 +175,7 @@ namespace tut { viewerNetworkTest() { + LLGridManager::createInstance(); LLFile::remove(TEST_FILENAME); gCmdLineLoginURI.clear(); gCmdLineGridChoice.clear(); @@ -185,6 +186,7 @@ namespace tut ~viewerNetworkTest() { LLFile::remove(TEST_FILENAME); + LLGridManager::deleteSingleton(); } }; diff --git a/indra/newview/tests/llvieweroctree_stub.cpp b/indra/newview/tests/llvieweroctree_stub.cpp index caf9299a2f..e850efd9ac 100644 --- a/indra/newview/tests/llvieweroctree_stub.cpp +++ b/indra/newview/tests/llvieweroctree_stub.cpp @@ -35,7 +35,7 @@ bool LLViewerOctreeCull::checkObjects(const OctreeNode* branch, const LLViewerOc void LLViewerOctreeCull::processGroup(LLViewerOctreeGroup* group) {} -bool LLViewerOctreeGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& maxOut) { return false; } +bool LLViewerOctreeGroup::boundObjects(bool empty, LLVector4a& minOut, LLVector4a& maxOut) { return false; } void LLViewerOctreeGroup::unbound() {} void LLViewerOctreeGroup::rebound() {} void LLViewerOctreeGroup::handleInsertion(const TreeNode* node, LLViewerOctreeEntry* obj) {} @@ -55,8 +55,8 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh void LLOcclusionCullingGroup::setOcclusionState(U32 state, S32 mode) {} void LLOcclusionCullingGroup::clearOcclusionState(U32 state, S32 mode) {} void LLOcclusionCullingGroup::handleChildAddition(const OctreeNode *parent, OctreeNode *child) {} -BOOL LLOcclusionCullingGroup::isRecentlyVisible() const { return FALSE; } -BOOL LLOcclusionCullingGroup::isAnyRecentlyVisible() const { return FALSE; } +bool LLOcclusionCullingGroup::isRecentlyVisible() const { return false; } +bool LLOcclusionCullingGroup::isAnyRecentlyVisible() const { return false; } LLViewerOctreeGroup::LLViewerOctreeGroup(OctreeNode* node) : mOctreeNode(node) {} @@ -81,6 +81,6 @@ LLViewerOctreePartition::LLViewerOctreePartition() = default; LLViewerOctreePartition::~LLViewerOctreePartition() = default; void LLViewerOctreePartition::cleanup() {} -BOOL LLViewerOctreeGroup::isRecentlyVisible() const { return FALSE; } +bool LLViewerOctreeGroup::isRecentlyVisible() const { return false; } diff --git a/indra/newview/tests/llviewershadermgr_stub.cpp b/indra/newview/tests/llviewershadermgr_stub.cpp deleted file mode 100644 index 5d6cb33019..0000000000 --- a/indra/newview/tests/llviewershadermgr_stub.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file llglslshader_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&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 "../llviewershadermgr.h" - -LLShaderMgr::LLShaderMgr() {} -LLShaderMgr::~LLShaderMgr() {} - -LLViewerShaderMgr::LLViewerShaderMgr() {} -LLViewerShaderMgr::~LLViewerShaderMgr() {} - -LLViewerShaderMgr* stub_instance = NULL; - -LLViewerShaderMgr* LLViewerShaderMgr::instance() { - if(NULL == stub_instance) - { - stub_instance = new LLViewerShaderMgr(); - } - - return stub_instance; -} -LLViewerShaderMgr::shader_iter fake_iter; -LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const {return fake_iter;} -LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const {return fake_iter;} - -void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader* shader) {return;} -std::string LLViewerShaderMgr::getShaderDirPrefix() {return "SHADER_DIR_PREFIX-";} diff --git a/indra/newview/tests/llwlanimator_stub.cpp b/indra/newview/tests/llwlanimator_stub.cpp deleted file mode 100644 index 2b4510a6b7..0000000000 --- a/indra/newview/tests/llwlanimator_stub.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @file llwlanimator_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&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$ - */ - -LLWLAnimator::LLWLAnimator(void) {} -void LLWLAnimator::update(LLWLParamSet& set) {} -void LLWLAnimator::setTrack(std::map<F32, LLWLParamKey>& track, F32 dayRate, F64 dayTime, bool run) {} diff --git a/indra/newview/tests/llwldaycycle_stub.cpp b/indra/newview/tests/llwldaycycle_stub.cpp deleted file mode 100644 index cd82e9b200..0000000000 --- a/indra/newview/tests/llwldaycycle_stub.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file llwldaycycle_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&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$ - */ - -LLWLDayCycle::LLWLDayCycle(void) -{ -} - -LLWLDayCycle::~LLWLDayCycle(void) -{ -} - -bool LLWLDayCycle::getKeytime(LLWLParamKey keyFrame, F32& keyTime) -{ - keyTime = 0.5; - return true; -} - -bool LLWLDayCycle::removeKeyframe(F32 time) -{ - return true; -} - -void LLWLDayCycle::loadDayCycleFromFile(const std::string& fileName) -{ -} - -void LLWLDayCycle::removeReferencesTo(const LLWLParamKey &keyframe) -{ -} diff --git a/indra/newview/tests/llwlparammanager_test.cpp b/indra/newview/tests/llwlparammanager_test.cpp deleted file mode 100644 index 2838ddb719..0000000000 --- a/indra/newview/tests/llwlparammanager_test.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/** - * @file llwlparammanager_test.cpp - * @brief LLWLParamManager tests - * - * $LicenseInfo:firstyear=2009&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$ - */ - -// Precompiled headers -#include "../llviewerprecompiledheaders.h" - -// Class to test -#include "../llwlparammanager.h" - -// Dependencies -#include "linden_common.h" - -// TUT header -#include "lltut.h" - -// Stubs -#include "llwldaycycle_stub.cpp" -#include "llwlparamset_stub.cpp" -#include "llwlanimator_stub.cpp" -#include "llglslshader_stub.cpp" -#include "lldir_stub.cpp" -#include "llsky_stub.cpp" -#include "llpipeline_stub.cpp" -#include "llviewershadermgr_stub.cpp" - -void assert_glerror(void) {} -LLViewerCamera::LLViewerCamera() {} -void LLViewerCamera::setView(F32 vertical_fov_rads) {} -std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return std::string(""); } - -char* curl_unescape(const char* c_str, int length) -{ - char* copy = new char[length+4]; - memcpy(copy, c_str, length); - copy[length+0] = 'E'; - copy[length+1] = 'S'; - copy[length+2] = 'C'; - copy[length+3] = '\0'; - return copy; -} -void curl_free(void* p) {delete[] ((char*)p);} -char* curl_escape(const char* c_str, int length) { - char* copy = new char[length+6]; - memcpy(copy, c_str, length); - copy[length+0] = 'U'; - copy[length+1] = 'N'; - copy[length+2] = 'E'; - copy[length+3] = 'S'; - copy[length+4] = 'C'; - copy[length+5] = '\0'; - return copy; -} - -namespace tut -{ - // Main Setup - struct LLWLParamManagerFixture - { - class LLWLParamManagerTest - { - }; - - LLWLParamManager* mTestManager; - - LLWLParamManagerFixture() - : mTestManager(LLWLParamManager::getInstance()) - { - } - - ~LLWLParamManagerFixture() - { - } - }; - typedef test_group<LLWLParamManagerFixture> factory; - typedef factory::object object; - factory tf("LLWLParamManager test"); - - // Tests - template<> template<> - void object::test<1>() - { - try - { - std::string preset = - "<llsd>\ - <map>\ - <key>ambient</key>\ - <array>\ - <real>1.0499999523162842</real>\ - <real>1.0499999523162842</real>\ - <real>1.0499999523162842</real>\ - <real>0.34999999403953552</real>\ - </array>\ - <key>blue_density</key>\ - <array>\ - <real>0.2447581488182351</real>\ - <real>0.44872328639030457</real>\ - <real>0.75999999046325684</real>\ - <real>0.38000004053115788</real>\ - </array>\ - <key>blue_horizon</key>\ - <array>\ - <real>0.49548382097675159</real>\ - <real>0.49548381382419748</real>\ - <real>0.63999999284744291</real>\ - <real>0.31999999642372146</real>\ - </array>\ - <key>cloud_color</key>\ - <array>\ - <real>0.40999999165535073</real>\ - <real>0.40999999165535073</real>\ - <real>0.40999999165535073</real>\ - <real>0.40999999165535073</real>\ - </array>\ - <key>cloud_pos_density1</key>\ - <array>\ - <real>1.6884100437164307</real>\ - <real>0.52609699964523315</real>\ - <real>0.99999999999999289</real>\ - <real>1</real>\ - </array>\ - <key>cloud_pos_density2</key>\ - <array>\ - <real>1.6884100437164307</real>\ - <real>0.52609699964523315</real>\ - <real>0.125</real>\ - <real>1</real>\ - </array>\ - <key>cloud_scale</key>\ - <array>\ - <real>0.4199999868869746</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>cloud_scroll_rate</key>\ - <array>\ - <real>10.199999809265137</real>\ - <real>10.01099967956543</real>\ - </array>\ - <key>cloud_shadow</key>\ - <array>\ - <real>0.26999998092651367</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>density_multiplier</key>\ - <array>\ - <real>0.00017999998817685818</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>distance_multiplier</key>\ - <array>\ - <real>0.80000001192093606</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>east_angle</key>\ - <real>0</real>\ - <key>enable_cloud_scroll</key>\ - <array>\ - <boolean>1</boolean>\ - <boolean>1</boolean>\ - </array>\ - <key>gamma</key>\ - <array>\ - <real>1</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>glow</key>\ - <array>\ - <real>5</real>\ - <real>0.0010000000474974513</real>\ - <real>-0.47999998927116394</real>\ - <real>1</real>\ - </array>\ - <key>haze_density</key>\ - <array>\ - <real>0.69999998807907104</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>haze_horizon</key>\ - <array>\ - <real>0.18999999761581243</real>\ - <real>0.19915600121021271</real>\ - <real>0.19915600121021271</real>\ - <real>1</real>\ - </array>\ - <key>lightnorm</key>\ - <array>\ - <real>0</real>\ - <real>0.70710659027099609</real>\ - <real>-0.70710694789886475</real>\ - <real>0</real>\ - </array>\ - <key>max_y</key>\ - <array>\ - <real>1605</real>\ - <real>0</real>\ - <real>0</real>\ - <real>1</real>\ - </array>\ - <key>preset_num</key>\ - <integer>22</integer>\ - <key>star_brightness</key>\ - <real>0</real>\ - <key>sun_angle</key>\ - <real>2.3561947345733643</real>\ - <key>sunlight_color</key>\ - <array>\ - <real>0.73421055078505759</real>\ - <real>0.78157895803450828</real>\ - <real>0.89999997615813498</real>\ - <real>0.29999998211860301</real>\ - </array>\ - </map>\ - </llsd>"; - - std::stringstream preset_stream(preset); - mTestManager->loadPresetFromXML(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), preset_stream); - LLWLParamSet dummy; - ensure("Couldn't get ParamSet after loading it", mTestManager->getParamSet(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), dummy)); - } - catch (...) - { - fail("loadPresetFromXML test crashed!"); - } - } - - template<> template<> - void object::test<2>() - { - mTestManager->propagateParameters(); - ensure_equals("Wrong value from getDomeOffset()", mTestManager->getDomeOffset(), 0.96f); - ensure_equals("Wrong value from getDomeRadius()", mTestManager->getDomeRadius(), 15000.f); - ensure_equals("Wrong value from getLightDir()", mTestManager->getLightDir(), LLVector4(-0,0,1,0)); - ensure_equals("Wrong value from getClampedLightDir()", mTestManager->getClampedLightDir(), LLVector4(-0,0,1,0)); - ensure_equals("Wrong value from getRotatedLightDir()", mTestManager->getRotatedLightDir(), LLVector4(0,0,0,1)); - } -} diff --git a/indra/newview/tests/llwlparamset_stub.cpp b/indra/newview/tests/llwlparamset_stub.cpp deleted file mode 100644 index e6c4221895..0000000000 --- a/indra/newview/tests/llwlparamset_stub.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file llwlparamset_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&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$ - */ - -LLWLParamSet::LLWLParamSet(void) -{ -} - -void LLWLParamSet::updateCloudScrolling() -{ -} - -void LLWLParamSet::set(const std::string& name, const LLVector4& val) -{ -} - -void LLWLParamSet::update(LLGLSLShader *shader) const -{ -} diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index ee6281fc24..c77ce367c5 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -62,8 +62,8 @@ namespace tut // These variables are required by machinery used by // LLXMLRPCTransaction. The values reflect reality for this test // executable; hopefully these values are correct. - gSavedSettings.declareBOOL("BrowserProxyEnabled", FALSE, "", LLControlVariable::PERSIST_NO); // don't persist - gSavedSettings.declareBOOL("NoVerifySSLCert", TRUE, "", LLControlVariable::PERSIST_NO); // don't persist + gSavedSettings.declareBOOL("BrowserProxyEnabled", false, "", LLControlVariable::PERSIST_NO); // don't persist + gSavedSettings.declareBOOL("NoVerifySSLCert", true, "", LLControlVariable::PERSIST_NO); // don't persist } // LLEventPump listener signature diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index a8bbfe636f..326b3adaaf 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -64,7 +64,15 @@ class ViewerManifest(LLManifest): super(ViewerManifest, self).construct() self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg") - os.environ["XZ_DEFAULTS"] = "-T0" + # ... and the lsl/lua script definition files (needed at build time and packaging) + pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') + with self.prefix(src=os.path.join(pkgdir, 'lsl_definitions'), dst="app_settings/syntax_default"): + self.path("*.txt") + self.path("*.yaml") + self.path("*.xml") + self.path("*.json") + self.path("*.luau") + self.path("*.yml") if self.is_packaging_viewer(): with self.prefix(src_dst="app_settings"): @@ -94,7 +102,7 @@ class ViewerManifest(LLManifest): with self.prefix(src=pkgdir): self.path("dictionaries") - # include the extracted packages information (see BuildPackagesInfo.cmake) + # include the extracted packages information self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt") # CHOP-955: If we have "sourceid" or "viewer_channel" in the # build process environment, generate it into @@ -1328,381 +1336,6 @@ class Darwin_x86_64_Manifest(ViewerManifest): print("Velopack releases directory: %s" % releases_dir) -class Darwin_arm64_Manifest(ViewerManifest): - build_data_json_platform = 'mac' - address_size = 64 - - def finish_build_data_dict(self, build_data_dict): - build_data_dict.update({'Bundle Id':self.args['bundleid']}) - return build_data_dict - - def is_packaging_viewer(self): - # darwin requires full app bundle packaging even for debugging. - return True - - def is_rearranging(self): - # That said, some stuff should still only be performed once. - # Are either of these actions in 'actions'? Is the set intersection - # non-empty? - return bool(set(["package", "unpacked"]).intersection(self.args['actions'])) - - def construct(self): - # copy over the build result (this is a no-op if run within the xcode - # script) - self.path(os.path.join(self.args['configuration'], self.channel() + ".app"), dst="") - - pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') - relpkgdir = os.path.join(pkgdir, "lib", "release") - debpkgdir = os.path.join(pkgdir, "lib", "debug") - - 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. - 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) - self.put_in_file( - plistlib.dumps(Info), - os.path.basename(Info_plist), - "Info.plist") - - # 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) - - if self.args.get('bugsplat'): - self.path2basename(relpkgdir, "BugsplatMac.framework") - - with self.prefix(dst="MacOS"): - executable = self.dst_path_of(self.channel()) - if self.args.get('bugsplat'): - # According to Apple Technical Note TN2206: - # https://developer.apple.com/library/archive/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG207 - # "If an app uses @rpath or an absolute path to link to a - # dynamic library outside of the app, the app will be - # rejected by Gatekeeper. ... Neither the codesign nor the - # spctl tool will show the error." - # (Thanks, Apple. Maybe fix spctl to warn?) - # The BugsplatMac framework embeds @rpath, which is - # causing scary Gatekeeper popups at viewer start. Work - # around this by changing the reference baked into our - # viewer. The install_name_tool -change option needs the - # previous value. Instead of guessing -- which might - # silently be defeated by a BugSplat SDK update that - # changes their baked-in @rpath -- ask for the path - # stamped into the framework. - # Let exception, if any, propagate -- if this doesn't - # work, we need the build to noisily fail! - 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 - self.run_command( - ['install_name_tool', '-change', oldpath, - '@executable_path/../Frameworks/BugsplatMac.framework/BugsplatMac', - executable]) - - # NOTE: the -S argument to strip causes it to keep - # enough info for annotated backtraces (i.e. function - # names in the crash log). 'strip' with no arguments - # yields a slightly smaller binary but makes crash - # logs mostly useless. This may be desirable for the - # final release. Or not. - if ("package" in self.args['actions'] or - "unpacked" in self.args['actions']): - self.run_command( - ['strip', '-S', executable]) - - with self.prefix(dst="Resources"): - # defer cross-platform file copies until we're in the - # nested Resources directory - super().construct() - - # need .icns file referenced by Info.plist - with self.prefix(src=self.icon_path(), dst="") : - self.path("secondlife.icns") - - # Copy in the updater script and helper modules - self.path(src=os.path.join(pkgdir, 'VMP'), dst="updater") - - with self.prefix(src="", dst=os.path.join("updater", "icons")): - self.path2basename(self.icon_path(), "secondlife.ico") - with self.prefix(src="vmp_icons", dst=""): - self.path("*.png") - self.path("*.gif") - - with self.prefix(src=relpkgdir, dst=""): - self.path("libndofdev.dylib") - self.path("libhunspell-*.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") - - # Translations - self.path("English.lproj/language.txt") - self.replace_in(src="English.lproj/InfoPlist.strings", - dst="English.lproj/InfoPlist.strings", - searchdict={'%%VERSION%%':'.'.join(self.args['version'])} - ) - self.path("German.lproj") - self.path("Japanese.lproj") - self.path("Korean.lproj") - self.path("da.lproj") - self.path("es.lproj") - self.path("fr.lproj") - self.path("hu.lproj") - self.path("it.lproj") - self.path("nl.lproj") - self.path("pl.lproj") - self.path("pt.lproj") - self.path("ru.lproj") - self.path("tr.lproj") - self.path("uk.lproj") - self.path("zh-Hans.lproj") - - def path_optional(src, dst): - """ - For a number of our self.path() calls, not only do we want - to deal with the absence of src, we also want to remember - which were present. Return either an empty list (absent) - or a list containing dst (present). Concatenate these - return values to get a list of all libs that are present. - """ - # This was simple before we started needing to pass - # wildcards. Fortunately, self.path() ends up appending a - # (source, dest) pair to self.file_list for every expanded - # file processed. Remember its size before the call. - oldlen = len(self.file_list) - try: - self.path(src, dst) - # The dest appended to self.file_list has been prepended - # with self.get_dst_prefix(). Strip it off again. - added = [os.path.relpath(d, self.get_dst_prefix()) - for s, d in self.file_list[oldlen:]] - except MissingError as err: - print("Warning: "+err.msg, file=sys.stderr) - added = [] - if not added: - print("Skipping %s" % dst) - return added - - # 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. - # Need to get the llcommon dll from any of the build directories as well. - libfile_parent = self.get_dst_prefix() - dylibs=[] - for libfile in ( - "libapr-1.0.dylib", - "libaprutil-1.0.dylib", - "libexpat.1.dylib", - # libnghttp2.dylib is a symlink to - # libnghttp2.major.dylib, which is a symlink to - # libnghttp2.version.dylib. Get all of them. - "libnghttp2.*dylib", - "liburiparser.*dylib", - ): - dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) - - # SLVoice executable - with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')): - self.path("SLVoice") - - # Vivox libraries - for libfile in ( - 'libortp.dylib', - 'libvivoxsdk.dylib', - ): - self.path2basename(relpkgdir, libfile) - - # Fmod studio dylibs (vary based on configuration) - if self.args['fmodstudio'] == 'ON': - if self.args['buildtype'].lower() == 'debug': - for libfile in ( - "libfmodL.dylib", - ): - dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile) - else: - for libfile in ( - "libfmod.dylib", - ): - dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) - - # our apps - executable_path = {} - embedded_apps = [ (os.path.join("llplugin", "slplugin"), "SLPlugin.app") ] - for app_bld_dir, app in embedded_apps: - self.path2basename(os.path.join(os.pardir, - app_bld_dir, self.args['configuration']), - app) - 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' - self.path2basename("../media_plugins/cef/" + self.args['configuration'], - dylibexecutable) - - # 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 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)]) - - # copy LibVLC dynamic libraries - with self.prefix(src=relpkgdir, dst="lib"): - self.path( "libvlc*.dylib*" ) - # copy LibVLC plugins folder - with self.prefix(src='plugins', dst=""): - self.path( "*.dylib" ) - self.path( "plugins.dat" ) - - def package_finish(self): - imagename = self.installer_base_name() - self.set_github_output('imagename', imagename) - finalname = imagename + ".dmg" - self.package_file = finalname - - RUNNER_TEMP = os.getenv('RUNNER_TEMP') - # When running as a GitHub Action job, RUNNER_TEMP is the recommended - # temp directory. If we're not running on GitHub, don't create this - # temp directory or this tarball: we don't clean them up, trusting - # that the runner is itself transient. On a dev machine, that would - # result in temp-directory clutter. - if RUNNER_TEMP: - # Per GitHub's actions/upload-artifact documentation - # https://github.com/actions/upload-artifact#maintaining-file-permissions-and-case-sensitive-files - # we must package the app bundle with tar before posting as an - # artifact. Posting individual files follows symlinks, which - # causes problems, especially with frameworks: a framework's top - # level must contain symlinks into its Versions/Current, which - # must itself be a symlink to some specific Versions subdir. - tarpath = os.path.join(RUNNER_TEMP, "viewer.tar.xz") - print(f'Creating {tarpath} from {self.get_dst_prefix()}') - with tarfile.open(tarpath, mode="w:xz") as tarball: - # Store in the tarball as just 'Second Life Mumble.app' - # instead of 'Users/someone/.../newview/Release/Second...' - # It's at this point that we rename 'Second Life Release.app' - # to 'Second Life Viewer.app'. - tarball.add(self.get_dst_prefix(), - arcname=self.app_name() + ".app") - self.set_github_output_path('viewer_app', tarpath) - - class LinuxManifest(ViewerManifest): build_data_json_platform = 'lnx' @@ -1718,20 +1351,15 @@ class LinuxManifest(ViewerManifest): self.path("licenses-linux.txt","licenses.txt") with self.prefix("linux_tools"): - self.path("client-readme.txt","README-linux.txt") - self.path("client-readme-voice.txt","README-linux-voice.txt") - self.path("client-readme-joystick.txt","README-linux-joystick.txt") self.path("wrapper.sh","secondlife") with self.prefix(dst="etc"): self.path("handle_secondlifeprotocol.sh") self.path("register_secondlifeprotocol.sh") self.path("refresh_desktop_app_entry.sh") - self.path("launch_url.sh") self.path("install.sh") with self.prefix(dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") - #self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") self.path2basename("../llplugin/slplugin", "SLPlugin") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 #with self.prefix(src="../viewer_components/manager", dst=""): @@ -1744,36 +1372,53 @@ class LinuxManifest(ViewerManifest): # the correct branded icon # Get the icons based on the channel type icon_path = self.icon_path() - #print("DEBUG: icon_path '%s'" % icon_path) + print("DEBUG: icon_path '%s'" % icon_path) with self.prefix(src=icon_path) : self.path("secondlife_256.png","secondlife_icon.png") with self.prefix(dst="res-sdl") : self.path("secondlife_256.BMP","ll_icon.BMP") + with self.prefix(src=os.path.join(self.args['build'], os.pardir, "llwebrtc" ), dst="lib"): + self.path("libllwebrtc.so") + # plugins - with self.prefix(src=os.path.join(self.args['build'], os.pardir, 'media_plugins'), dst="bin/llplugin"): - self.path("gstreamer10/libmedia_plugin_gstreamer10.so", "libmedia_plugin_gstreamer.so") + with self.prefix(dst="bin/llplugin"): + with self.prefix(src=os.path.join(self.args['build'], os.pardir, 'media_plugins')): + with self.prefix(src='cef'): + self.path("libmedia_plugin_cef.so") + + # Media plugins - LibVLC + with self.prefix(src='libvlc'): + self.path("libmedia_plugin_libvlc.so") + + # GStreamer 1.0 Media Plugin + with self.prefix(src='gstreamer10'): + self.path("libmedia_plugin_gstreamer10.so") + + # Media plugins - Example (useful for debugging - not shipped with release viewer) + if self.channel_type() != 'release': + with self.prefix(src='example'): + self.path("libmedia_plugin_example.so") - with self.prefix(src=os.path.join(self.args['build'], os.pardir, 'media_plugins'), dst="bin/llplugin"): - self.path("cef/libmedia_plugin_cef.so", "libmedia_plugin_cef.so" ) with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="lib"): self.path( "libcef.so" ) - self.path( "libEGL*" ) self.path( "libvulkan*" ) self.path( "libvk_swiftshader*" ) self.path( "libGLESv2*" ) - self.path( "vk_swiftshader_icd.json") with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="bin"): self.path( "chrome-sandbox" ) self.path( "dullahan_host" ) - self.path( "snapshot_blob.bin" ) + + with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="bin"): self.path( "v8_context_snapshot.bin" ) - with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="lib"): - self.path( "snapshot_blob.bin" ) + self.path( "vk_swiftshader_icd.json") + + with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="lib"): self.path( "v8_context_snapshot.bin" ) + self.path( "vk_swiftshader_icd.json") with self.prefix(src=os.path.join(pkgdir, 'resources'), dst="lib"): self.path( "chrome_100_percent.pak" ) @@ -1782,59 +1427,7 @@ class LinuxManifest(ViewerManifest): self.path( "icudtl.dat" ) with self.prefix(src=os.path.join(pkgdir, 'resources', 'locales'), dst=os.path.join('lib', 'locales')): - self.path("am.pak") - self.path("ar.pak") - self.path("bg.pak") - self.path("bn.pak") - self.path("ca.pak") - self.path("cs.pak") - self.path("da.pak") - self.path("de.pak") - self.path("el.pak") - self.path("en-GB.pak") - self.path("en-US.pak") - self.path("es-419.pak") - self.path("es.pak") - self.path("et.pak") - self.path("fa.pak") - self.path("fi.pak") - self.path("fil.pak") - self.path("fr.pak") - self.path("gu.pak") - self.path("he.pak") - self.path("hi.pak") - self.path("hr.pak") - self.path("hu.pak") - self.path("id.pak") - self.path("it.pak") - self.path("ja.pak") - self.path("kn.pak") - self.path("ko.pak") - self.path("lt.pak") - self.path("lv.pak") - self.path("ml.pak") - self.path("mr.pak") - self.path("ms.pak") - self.path("nb.pak") - self.path("nl.pak") - self.path("pl.pak") - self.path("pt-BR.pak") - self.path("pt-PT.pak") - self.path("ro.pak") - self.path("ru.pak") - self.path("sk.pak") - self.path("sl.pak") - self.path("sr.pak") - self.path("sv.pak") - self.path("sw.pak") - self.path("ta.pak") - self.path("te.pak") - self.path("th.pak") - self.path("tr.pak") - self.path("uk.pak") - self.path("vi.pak") - self.path("zh-CN.pak") - self.path("zh-TW.pak") + self.path("*.pak") self.path("featuretable_linux.txt") self.path("cube.dae") @@ -1877,6 +1470,8 @@ class LinuxManifest(ViewerManifest): try: # only create tarball if it's a release build. if self.args['buildtype'].lower() == 'release': + # --numeric-owner hides the username of the builder for + # security etc. self.run_command(['tar', '-C', self.get_build_prefix(), '--numeric-owner', '-cJf', tarName, installer_name]) @@ -1888,14 +1483,7 @@ class LinuxManifest(ViewerManifest): self.run_command(["mv", versionedName, realname]) def strip_binaries(self): - doStrip = False if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): - doStrip = True - # In case of flatpak flatpak-build will call strip, disable doStrip here to get a flatpak symbol package. Increases flatpak size by about 1G - if "FLATPAK_DEST" in os.environ: - doStrip = True - - if doStrip: print("* Going strip-crazy on the packaged binaries, since this is a Release build") # makes some small assumptions about our packaged dir structure self.run_command( @@ -1908,6 +1496,7 @@ class LinuxManifest(ViewerManifest): '!', '-name', '*.crt', '!', '-name', '*.dll', '!', '-name', '*.lib', + '!', '-name', '*.json', '!', '-name', 'update_install', '-exec', 'strip', '-S', '{}', ';']) class Linux_x86_64_Manifest(LinuxManifest): @@ -1921,49 +1510,16 @@ class Linux_x86_64_Manifest(LinuxManifest): pkgdir = self.args['package_dir'] relpkgdir = os.path.join(pkgdir, "lib", "release") - debpkgdir = os.path.join(pkgdir, "lib", "debug") + #debpkgdir = os.path.join(pkgdir, "lib", "debug") with self.prefix(src=relpkgdir, dst="lib"): - self.path("libdb*.so") - self.path("libuuid.so*") - self.path("libSDL-1.2.so.*") - self.path("libdirectfb-1.*.so.*") - self.path("libfusion-1.*.so.*") - self.path("libdirect-1.*.so.*") - self.path("libopenjp2.so*") - self.path("libdirectfb-1.4.so.5") - self.path("libfusion-1.4.so.5") - self.path("libdirect-1.4.so.5*") + self.path("libSDL*.so.*") + self.path("libalut.so*") self.path("libopenal.so*") - # 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 + if self.args['discord'] == 'ON': + self.path("libdiscord_partner_sdk.so*") self.strip_binaries() ################################################################ |
