summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt57
-rw-r--r--indra/newview/SecondLife.nibbin12345 -> 0 bytes
-rw-r--r--indra/newview/SecondLife.xib1327
-rwxr-xr-xindra/newview/app_settings/message.xml751
-rw-r--r--indra/newview/app_settings/settings.xml2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/CASF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl28
-rw-r--r--indra/newview/gltf/asset.cpp4
-rw-r--r--indra/newview/installers/windows/installer_template.nsi86
-rw-r--r--indra/newview/llagentcamera.cpp10
-rw-r--r--indra/newview/llappdelegate-objc.mm2
-rw-r--r--indra/newview/llappviewer.cpp262
-rw-r--r--indra/newview/llappviewer.h6
-rw-r--r--indra/newview/llappviewerlinux.cpp5
-rw-r--r--indra/newview/llappviewermacosx-objc.h3
-rw-r--r--indra/newview/llappviewermacosx-objc.mm39
-rw-r--r--indra/newview/llappviewermacosx.cpp5
-rw-r--r--indra/newview/llappviewerwin32.cpp20
-rw-r--r--indra/newview/llchathistory.cpp18
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp19
-rw-r--r--indra/newview/llconversationview.cpp2
-rw-r--r--indra/newview/lldrawpool.h4
-rw-r--r--indra/newview/lldrawpoolwater.cpp2
-rw-r--r--indra/newview/llface.cpp6
-rw-r--r--indra/newview/llfilepicker.cpp10
-rw-r--r--indra/newview/llfilepicker_mac.mm6
-rw-r--r--indra/newview/llfloateremojipicker.cpp4
-rw-r--r--indra/newview/llfloaterjoystick.cpp2
-rw-r--r--indra/newview/llfloatermarketplace.cpp63
-rw-r--r--indra/newview/llfloatermarketplace.h46
-rw-r--r--indra/newview/llfloaterpreference.cpp30
-rw-r--r--indra/newview/llfloaterpreference.h3
-rw-r--r--indra/newview/llfloaterpreferencesgraphicsadvanced.h2
-rw-r--r--indra/newview/llfloatersearch.cpp185
-rw-r--r--indra/newview/llfloatersearch.h82
-rw-r--r--indra/newview/llgltfmateriallist.cpp7
-rw-r--r--indra/newview/llgltfmaterialpreviewmgr.cpp10
-rw-r--r--indra/newview/llheroprobemanager.cpp11
-rw-r--r--indra/newview/llhudeffectresetskeleton.cpp9
-rw-r--r--indra/newview/llhudeffectresetskeleton.h13
-rw-r--r--indra/newview/llinventoryfunctions.cpp25
-rw-r--r--indra/newview/llinventoryfunctions.h1
-rw-r--r--indra/newview/llinventorygallerymenu.cpp7
-rw-r--r--indra/newview/llinventorygallerymenu.h1
-rw-r--r--indra/newview/llinventorypanel.cpp8
-rw-r--r--indra/newview/llinventorypanel.h1
-rw-r--r--indra/newview/lllocalbitmaps.cpp2
-rw-r--r--indra/newview/lllocalgltfmaterials.cpp2
-rw-r--r--indra/newview/llmachineid.cpp4
-rw-r--r--indra/newview/llmaterialeditor.cpp5
-rw-r--r--indra/newview/llmediactrl.cpp10
-rw-r--r--indra/newview/llmediactrl.h1
-rw-r--r--indra/newview/llmeshrepository.cpp3
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp2
-rw-r--r--indra/newview/llreflectionmapmanager.cpp48
-rw-r--r--indra/newview/llreflectionmapmanager.h8
-rw-r--r--indra/newview/llslurl.cpp6
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp13
-rw-r--r--indra/newview/llstartup.cpp27
-rw-r--r--indra/newview/llstatusbar.cpp13
-rw-r--r--indra/newview/llstatusbar.h1
-rw-r--r--indra/newview/lltexturectrl.cpp49
-rw-r--r--indra/newview/lltexturectrl.h3
-rw-r--r--indra/newview/lltexturefetch.cpp6
-rw-r--r--indra/newview/lltextureview.cpp3
-rw-r--r--indra/newview/llviewercamera.cpp2
-rw-r--r--indra/newview/llviewercontrol.cpp8
-rw-r--r--indra/newview/llviewerdisplay.cpp2
-rw-r--r--indra/newview/llviewerfloaterreg.cpp3
-rw-r--r--indra/newview/llviewerjoystick.cpp6
-rw-r--r--indra/newview/llviewermedia.cpp145
-rw-r--r--indra/newview/llviewermedia.h12
-rw-r--r--indra/newview/llviewermenu.cpp15
-rw-r--r--indra/newview/llviewermenu.h2
-rw-r--r--indra/newview/llviewermenufile.cpp18
-rw-r--r--indra/newview/llviewermessage.cpp20
-rw-r--r--indra/newview/llviewernetwork.cpp4
-rw-r--r--indra/newview/llviewershadermgr.cpp116
-rw-r--r--indra/newview/llviewershadermgr.h5
-rw-r--r--indra/newview/llviewertexture.cpp65
-rw-r--r--indra/newview/llviewertexture.h4
-rw-r--r--indra/newview/llviewerthrottle.cpp11
-rw-r--r--indra/newview/llviewerthrottle.h1
-rw-r--r--indra/newview/llviewerwindow.cpp34
-rw-r--r--indra/newview/llvoavatar.cpp8
-rw-r--r--indra/newview/llvocache.cpp11
-rw-r--r--indra/newview/llvoicechannel.cpp4
-rw-r--r--indra/newview/llvoicechannel.h1
-rw-r--r--indra/newview/llvoiceclient.cpp9
-rw-r--r--indra/newview/llvoicewebrtc.cpp174
-rw-r--r--indra/newview/llvoicewebrtc.h9
-rw-r--r--indra/newview/llwearableitemslist.cpp7
-rw-r--r--indra/newview/pipeline.cpp157
-rw-r--r--indra/newview/pipeline.h5
-rw-r--r--indra/newview/skins/default/xui/da/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_marketplace.xml201
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml202
-rw-r--r--indra/newview/skins/default/xui/en/floater_settings_debug.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_gallery_inventory.xml98
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml45
-rw-r--r--indra/newview/skins/default/xui/en/menu_media_ctrl.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_object_icon.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_objectim.xml7
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml30
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml21
-rw-r--r--indra/newview/skins/default/xui/es/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml16
-rwxr-xr-xindra/newview/viewer_manifest.py195
118 files changed, 3030 insertions, 2238 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 5274986ff0..eb40067930 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -59,6 +59,11 @@ if (NOT HAVOK_TPV)
# which means we need to duct tape this togther ...
add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions)
+ if (NOT "${LLPHYSICSEXTENSIONS_STUB_DIR}" STREQUAL "")
+ # for darwin universal builds we need both real llphysicsextensions and the stub for aarch64 fallback
+ # this will only be set when HAVOK is ON, otherwise the normal stub fallback will be in effect
+ add_subdirectory(${LLPHYSICSEXTENSIONS_STUB_DIR} llphysicsextensionsstub)
+ endif()
# Another hack that works with newer cmake versions:
cmake_policy( SET CMP0079 NEW)
@@ -393,6 +398,7 @@ set(viewer_SOURCE_FILES
llmaniprotate.cpp
llmanipscale.cpp
llmaniptranslate.cpp
+ llfloatermarketplace.cpp
llmarketplacefunctions.cpp
llmarketplacenotifications.cpp
llmaterialeditor.cpp
@@ -930,6 +936,7 @@ set(viewer_HEADER_FILES
llfloaterlinkreplace.h
llfloaterloadprefpreset.h
llfloatermap.h
+ llfloatermarketplace.h
llfloatermarketplacelistings.h
llfloatermediasettings.h
llfloatermemleak.h
@@ -1420,7 +1427,7 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
set_source_files_properties(
- llversioninfo.cpp tests/llversioninfo_test.cpp
+ llversioninfo.cpp tests/llversioninfo_test.cpp
PROPERTIES
COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake
)
@@ -1464,7 +1471,7 @@ if (DARWIN)
set(viewer_RESOURCE_FILES
secondlife.icns
Info-SecondLife.plist
- SecondLife.xib/
+ SecondLife.xib
# CMake doesn't seem to support Xcode language variants well just yet
English.lproj/InfoPlist.strings
English.lproj/language.txt
@@ -1635,7 +1642,7 @@ endif (WINDOWS)
file(GLOB_RECURSE viewer_XUI_FILES LIST_DIRECTORIES FALSE
${CMAKE_CURRENT_SOURCE_DIR}/skins/*.xml)
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/skins PREFIX "XUI Files" FILES ${viewer_XUI_FILES})
-set_source_files_properties(${viewer_XUI_FILES}
+set_source_files_properties(${viewer_XUI_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
@@ -1643,7 +1650,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
file(GLOB_RECURSE viewer_SHADER_FILES LIST_DIRECTORIES FALSE
${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders/*.glsl)
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders PREFIX "Shaders" FILES ${viewer_SHADER_FILES})
-set_source_files_properties(${viewer_SHADER_FILES}
+set_source_files_properties(${viewer_SHADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
list(APPEND viewer_SOURCE_FILES ${viewer_SHADER_FILES})
@@ -1668,7 +1675,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/toolbars.xml
app_settings/trees.xml
app_settings/viewerart.xml
- ${CMAKE_SOURCE_DIR}/../etc/message.xml
+ app_settings/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
packages-info.txt
featuretable.txt
@@ -1761,8 +1768,8 @@ if (WINDOWS)
# And of course it's straightforward to read a text file in Python.
set(COPY_INPUT_DEPENDENCIES
- # The following commented dependencies are determined at variably at build time. Can't do this here.
- ${CMAKE_SOURCE_DIR}/../etc/message.xml
+ # The following commented dependencies are determined variably at build time. Can't do this here.
+ app_settings/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
${SHARED_LIB_STAGING_DIR}/openjp2.dll
${SHARED_LIB_STAGING_DIR}/llwebrtc.dll
@@ -1947,7 +1954,14 @@ if (WINDOWS)
elseif (DARWIN)
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
- LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
+ RESOURCE SecondLife.xib
+ LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip"
+ # arch specific flags for universal builds: https://stackoverflow.com/a/77942065
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL"
+ XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB"
+ # only generate the .MAP file for llphysicsextensions_tpv on x86_64
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensions/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensions -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
+ XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensionsstub/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsstub"
)
else (WINDOWS)
# Linux
@@ -1970,7 +1984,7 @@ endif (WINDOWS)
# one of these being libz where you can find four or more versions in play
# at once. On Linux, libz can be found at link and run time via a number
# of paths:
-#
+#
# => -lfreetype
# => libz.so.1 (on install machine, not build)
# => -lSDL
@@ -2003,12 +2017,12 @@ target_link_libraries(${VIEWER_BINARY_NAME}
llcommon
llmeshoptimizer
llwebrtc
- ll::ndof
lllogin
llprimitive
llappearance
${LLPHYSICSEXTENSIONS_LIBRARIES}
ll::bugsplat
+ ll::ndof
ll::tracy
ll::openxr
)
@@ -2046,7 +2060,7 @@ foreach(elem ${country_codes})
set(emoji_mapping_src_file
"${emoji_mapping_src_folder}/${elem}/emoji_characters.xml")
set(emoji_mapping_dst_file
- "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")
+ "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")
configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY)
endforeach()
@@ -2148,16 +2162,14 @@ if (DARWIN)
# https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/
set(CMAKE_MACOSX_RPATH 1)
-
+
set_target_properties(
${VIEWER_BINARY_NAME}
PROPERTIES
OUTPUT_NAME "${product}"
# From Contents/MacOS/SecondLife, look in Contents/Frameworks
- INSTALL_RPATH "@loader_path/../Frameworks"
- # SIGH, as of 2018-05-24 (cmake 3.11.1) the INSTALL_RPATH property simply
- # does not work. Try this:
- LINK_FLAGS "-rpath @loader_path/../Frameworks"
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_RPATH "@executable_path/../Frameworks"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}"
)
@@ -2191,9 +2203,6 @@ if (DARWIN)
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
- DEPENDS
- ${VIEWER_BINARY_NAME}
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef)
@@ -2228,8 +2237,6 @@ if (DARWIN)
--touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/.${product}.bat
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
${SIGNING_SETTING}
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
endif (PACKAGE)
endif (DARWIN)
@@ -2269,7 +2276,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
PROPERTIES
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
XCODE_ATTRIBUTE_DWARF_DSYM_FOLDER_PATH "${SYMBOLS_STAGING_DIR}/dSYMs")
-
+
add_custom_command(OUTPUT "${VIEWER_APP_XCARCHIVE}"
COMMAND "zip"
ARGS
@@ -2304,7 +2311,7 @@ if (LL_TESTS)
# llremoteparcelrequest.cpp
llviewerhelputil.cpp
llversioninfo.cpp
-# llvocache.cpp
+# llvocache.cpp
llworldmap.cpp
llworldmipmap.cpp
)
@@ -2313,7 +2320,7 @@ if (LL_TESTS)
llworldmap.cpp
llworldmipmap.cpp
PROPERTIES
- LL_TEST_ADDITIONAL_SOURCE_FILES
+ LL_TEST_ADDITIONAL_SOURCE_FILES
tests/llviewertexture_stub.cpp
#llviewertexturelist.cpp
)
@@ -2347,7 +2354,7 @@ if (LL_TESTS)
llworldmap.cpp
llworldmipmap.cpp
PROPERTIES
- LL_TEST_ADDITIONAL_SOURCE_FILES
+ LL_TEST_ADDITIONAL_SOURCE_FILES
tests/llviewertexture_stub.cpp
)
diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib
deleted file mode 100644
index c4ddca50dc..0000000000
--- a/indra/newview/SecondLife.nib
+++ /dev/null
Binary files differ
diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib
index fbff8fe307..781a390673 100644
--- a/indra/newview/SecondLife.xib
+++ b/indra/newview/SecondLife.xib
@@ -1,1136 +1,193 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
- <data>
- <int key="IBDocument.SystemTarget">1060</int>
- <string key="IBDocument.SystemVersion">12E55</string>
- <string key="IBDocument.InterfaceBuilderVersion">4457.6</string>
- <string key="IBDocument.AppKitVersion">1187.39</string>
- <string key="IBDocument.HIToolboxVersion">626.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">4457.6</string>
- </object>
- <array key="IBDocument.IntegratedClassDependencies">
- <string>NSCustomObject</string>
- <string>NSMenu</string>
- <string>NSMenuItem</string>
- <string>NSScrollView</string>
- <string>NSScroller</string>
- <string>NSTextView</string>
- <string>NSView</string>
- <string>NSWindowTemplate</string>
- </array>
- <array key="IBDocument.PluginDependencies">
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </array>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
- <object class="NSCustomObject" id="1021">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSCustomObject" id="1014">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="1050">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSMenu" id="649796088">
- <string key="NSTitle">Main Menu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="694149608">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Second Life</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <object class="NSCustomResource" key="NSOnImage" id="353210768">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuCheckmark</string>
- </object>
- <object class="NSCustomResource" key="NSMixedImage" id="549394948">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuMixedState</string>
- </object>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="110575045">
- <string key="NSTitle">Second Life</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="238522557">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">About Second Life</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="304266470">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="609285721">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Preferences…</string>
- <string key="NSKeyEquiv">,</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="481834944">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1046388886">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Services</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="752062318">
- <string key="NSTitle">Services</string>
- <array class="NSMutableArray" key="NSMenuItems"/>
- <string key="NSName">_NSServicesMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="646227648">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="755159360">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Hide Second Life</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="342932134">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Hide Others</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="908899353">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Show All</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1056857174">
- <reference key="NSMenu" ref="110575045"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="632727374">
- <reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Quit Second Life</string>
- <string key="NSKeyEquiv">q</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSAppleMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="725688984">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Edit</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="701759256">
- <string key="NSTitle">Edit</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="521487141">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Undo</string>
- <string key="NSKeyEquiv">z</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="668936019">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Redo</string>
- <string key="NSKeyEquiv">Z</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="383018193">
- <reference key="NSMenu" ref="701759256"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="984623395">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Cut</string>
- <string key="NSKeyEquiv">x</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="656529582">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Copy</string>
- <string key="NSKeyEquiv">c</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="1032676691">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Paste</string>
- <string key="NSKeyEquiv">v</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="538907583">
- <reference key="NSMenu" ref="701759256"/>
- <string key="NSTitle">Select All</string>
- <string key="NSKeyEquiv">a</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="713487014">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Window</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="835318025">
- <string key="NSTitle">Window</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="1011231497">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Minimize</string>
- <string key="NSKeyEquiv">m</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="575023229">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Zoom</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="86356408">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Enter Full Screen</string>
- <string key="NSKeyEquiv">f</string>
- <int key="NSKeyEquivModMask">1310720</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="299356726">
- <reference key="NSMenu" ref="835318025"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- <object class="NSMenuItem" id="625202149">
- <reference key="NSMenu" ref="835318025"/>
- <string key="NSTitle">Bring All to Front</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSWindowsMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="391199113">
- <reference key="NSMenu" ref="649796088"/>
- <string key="NSTitle">Help</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="353210768"/>
- <reference key="NSMixedImage" ref="549394948"/>
- </object>
- </array>
- <string key="NSName">_NSMainMenu</string>
- </object>
- <object class="NSCustomObject" id="756173070">
- <string key="NSClassName">LLAppDelegate</string>
- </object>
- <object class="NSWindowTemplate" id="110292814">
- <int key="NSWindowStyleMask">15</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{196, 240}, {1024, 600}}</string>
- <int key="NSWTFlags">74974208</int>
- <string key="NSWindowTitle">Second Life</string>
- <string key="NSWindowClass">LLNSWindow</string>
- <nil key="NSViewClass"/>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <object class="NSView" key="NSWindowView" id="305280978">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews"/>
- <string key="NSFrameSize">{1024, 600}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <string key="NSReuseIdentifierKey">_NS:20</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
- <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
- <string key="NSFrameAutosaveName">Second Life</string>
- <int key="NSWindowCollectionBehavior">128</int>
- <bool key="NSWindowIsRestorable">NO</bool>
- </object>
- <object class="NSWindowTemplate" id="979091056">
- <int key="NSWindowStyleMask">31</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{272, 176}, {938, 42}}</string>
- <int key="NSWTFlags">-1535638528</int>
- <string key="NSWindowTitle">Input Window</string>
- <string key="NSWindowClass">LLUserInputWindow</string>
- <nil key="NSViewClass"/>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <object class="NSView" key="NSWindowView" id="1044753903">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSScrollView" id="238626476">
- <reference key="NSNextResponder" ref="1044753903"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSClipView" id="871543330">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">2322</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTextView" id="395788163">
- <reference key="NSNextResponder" ref="871543330"/>
- <int key="NSvFlags">2322</int>
- <set class="NSMutableSet" key="NSDragTypes">
- <string>Apple HTML pasteboard type</string>
- <string>Apple PDF pasteboard type</string>
- <string>Apple PICT pasteboard type</string>
- <string>Apple PNG pasteboard type</string>
- <string>Apple URL pasteboard type</string>
- <string>CorePasteboardFlavorType 0x6D6F6F76</string>
- <string>NSColor pasteboard type</string>
- <string>NSFilenamesPboardType</string>
- <string>NSStringPboardType</string>
- <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
- <string>NeXT RTFD pasteboard type</string>
- <string>NeXT Rich Text Format v1.0 pasteboard type</string>
- <string>NeXT TIFF v4.0 pasteboard type</string>
- <string>NeXT font pasteboard type</string>
- <string>NeXT ruler pasteboard type</string>
- <string>WebURLsWithTitlesPboardType</string>
- <string>public.url</string>
- </set>
- <string key="NSFrameSize">{938, 42}</string>
- <reference key="NSSuperview" ref="871543330"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="339833963"/>
- <string key="NSReuseIdentifierKey">_NS:13</string>
- <object class="NSTextContainer" key="NSTextContainer" id="648552009">
- <object class="NSLayoutManager" key="NSLayoutManager">
- <object class="NSTextStorage" key="NSTextStorage">
- <object class="NSMutableString" key="NSString">
- <characters key="NS.bytes"/>
- </object>
- <nil key="NSDelegate"/>
- </object>
- <array class="NSMutableArray" key="NSTextContainers">
- <reference ref="648552009"/>
- </array>
- <int key="NSLMFlags">166</int>
- <nil key="NSDelegate"/>
- </object>
- <reference key="NSTextView" ref="395788163"/>
- <double key="NSWidth">938</double>
- <int key="NSTCFlags">1</int>
- </object>
- <object class="NSTextViewSharedData" key="NSSharedData">
- <int key="NSFlags">67121127</int>
- <int key="NSTextCheckingTypes">0</int>
- <nil key="NSMarkedAttributes"/>
- <object class="NSColor" key="NSBackgroundColor" id="535647664">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <dictionary key="NSSelectedAttributes">
- <object class="NSColor" key="NSBackgroundColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">selectedTextBackgroundColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">selectedTextColor</string>
- <object class="NSColor" key="NSColor" id="835883401">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </dictionary>
- <reference key="NSInsertionColor" ref="835883401"/>
- <dictionary key="NSLinkAttributes">
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">1</int>
- <bytes key="NSRGB">MCAwIDEAA</bytes>
- </object>
- <object class="NSCursor" key="NSCursor">
- <string key="NSHotSpot">{8, -8}</string>
- <int key="NSCursorType">13</int>
- </object>
- <integer value="1" key="NSUnderline"/>
- </dictionary>
- <nil key="NSDefaultParagraphStyle"/>
- <nil key="NSTextFinder"/>
- <int key="NSPreferredTextFinderStyle">1</int>
- </object>
- <int key="NSTVFlags">6</int>
- <string key="NSMaxSize">{939, 10000000}</string>
- <nil key="NSDelegate"/>
- </object>
- </array>
- <string key="NSFrame">{{1, 1}, {938, 42}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="395788163"/>
- <string key="NSReuseIdentifierKey">_NS:11</string>
- <reference key="NSDocView" ref="395788163"/>
- <reference key="NSBGColor" ref="535647664"/>
- <object class="NSCursor" key="NSCursor">
- <string key="NSHotSpot">{4, 5}</string>
- <object class="NSImage" key="NSImage">
- <int key="NSImageFlags">79691776</int>
- <array key="NSReps">
- <array>
- <integer value="5"/>
- <object class="NSURL">
- <nil key="NS.base"/>
- <string key="NS.relative">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string>
- </object>
- </array>
- </array>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MCAwAA</bytes>
- </object>
- </object>
- </object>
- <int key="NScvFlags">4</int>
- </object>
- <object class="NSScroller" id="339833963">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{923, 1}, {16, 42}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
- <string key="NSReuseIdentifierKey">_NS:83</string>
- <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
- <reference key="NSTarget" ref="238626476"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.96666666666666667</double>
- </object>
- <object class="NSScroller" id="1067057765">
- <reference key="NSNextResponder" ref="238626476"/>
- <int key="NSvFlags">-2147483392</int>
- <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
- <reference key="NSSuperview" ref="238626476"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="871543330"/>
- <string key="NSReuseIdentifierKey">_NS:33</string>
- <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
- <int key="NSsFlags">1</int>
- <reference key="NSTarget" ref="238626476"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSCurValue">1</double>
- <double key="NSPercent">0.94565218687057495</double>
- </object>
- </array>
- <string key="NSFrame">{{-1, -1}, {940, 44}}</string>
- <reference key="NSSuperview" ref="1044753903"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="1067057765"/>
- <string key="NSReuseIdentifierKey">_NS:9</string>
- <int key="NSsFlags">133138</int>
- <reference key="NSVScroller" ref="339833963"/>
- <reference key="NSHScroller" ref="1067057765"/>
- <reference key="NSContentView" ref="871543330"/>
- <double key="NSMinMagnification">0.25</double>
- <double key="NSMaxMagnification">4</double>
- <double key="NSMagnification">1</double>
- </object>
- </array>
- <string key="NSFrameSize">{938, 42}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <reference key="NSNextKeyView" ref="238626476"/>
- <string key="NSReuseIdentifierKey">_NS:21</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
- <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
- <bool key="NSWindowIsRestorable">YES</bool>
- </object>
- </array>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <array class="NSMutableArray" key="connectionRecords">
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">terminate:</string>
- <reference key="source" ref="1050"/>
- <reference key="destination" ref="632727374"/>
- </object>
- <int key="connectionID">823</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">orderFrontStandardAboutPanel:</string>
- <reference key="source" ref="1021"/>
- <reference key="destination" ref="238522557"/>
- </object>
- <int key="connectionID">142</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="1021"/>
- <reference key="destination" ref="756173070"/>
- </object>
- <int key="connectionID">845</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">performMiniaturize:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="1011231497"/>
- </object>
- <int key="connectionID">37</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">arrangeInFront:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="625202149"/>
- </object>
- <int key="connectionID">39</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">performZoom:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="575023229"/>
- </object>
- <int key="connectionID">240</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hide:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="755159360"/>
- </object>
- <int key="connectionID">369</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hideOtherApplications:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="342932134"/>
- </object>
- <int key="connectionID">370</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">unhideAllApplications:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="908899353"/>
- </object>
- <int key="connectionID">372</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">cut:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="984623395"/>
- </object>
- <int key="connectionID">768</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">paste:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="1032676691"/>
- </object>
- <int key="connectionID">769</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">undo:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="521487141"/>
- </object>
- <int key="connectionID">776</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">copy:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="656529582"/>
- </object>
- <int key="connectionID">782</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">selectAll:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="538907583"/>
- </object>
- <int key="connectionID">785</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">toggleFullScreen:</string>
- <reference key="source" ref="1014"/>
- <reference key="destination" ref="86356408"/>
- </object>
- <int key="connectionID">842</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">window</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="110292814"/>
- </object>
- <int key="connectionID">850</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">inputWindow</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="979091056"/>
- </object>
- <int key="connectionID">953</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">inputView</string>
- <reference key="source" ref="756173070"/>
- <reference key="destination" ref="395788163"/>
- </object>
- <int key="connectionID">954</int>
- </object>
- </array>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <array key="orderedObjects">
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <array key="object" id="0"/>
- <reference key="children" ref="1048"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="1021"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="1014"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="1050"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">29</int>
- <reference key="object" ref="649796088"/>
- <array class="NSMutableArray" key="children">
- <reference ref="713487014"/>
- <reference ref="694149608"/>
- <reference ref="391199113"/>
- <reference ref="725688984"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">Main Menu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="713487014"/>
- <array class="NSMutableArray" key="children">
- <reference ref="835318025"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">56</int>
- <reference key="object" ref="694149608"/>
- <array class="NSMutableArray" key="children">
- <reference ref="110575045"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">103</int>
- <reference key="object" ref="391199113"/>
- <array class="NSMutableArray" key="children"/>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">57</int>
- <reference key="object" ref="110575045"/>
- <array class="NSMutableArray" key="children">
- <reference ref="238522557"/>
- <reference ref="755159360"/>
- <reference ref="908899353"/>
- <reference ref="632727374"/>
- <reference ref="646227648"/>
- <reference ref="609285721"/>
- <reference ref="481834944"/>
- <reference ref="304266470"/>
- <reference ref="1046388886"/>
- <reference ref="1056857174"/>
- <reference ref="342932134"/>
- </array>
- <reference key="parent" ref="694149608"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">58</int>
- <reference key="object" ref="238522557"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">134</int>
- <reference key="object" ref="755159360"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">150</int>
- <reference key="object" ref="908899353"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">136</int>
- <reference key="object" ref="632727374"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">144</int>
- <reference key="object" ref="646227648"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">129</int>
- <reference key="object" ref="609285721"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">143</int>
- <reference key="object" ref="481834944"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">236</int>
- <reference key="object" ref="304266470"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">131</int>
- <reference key="object" ref="1046388886"/>
- <array class="NSMutableArray" key="children">
- <reference ref="752062318"/>
- </array>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">149</int>
- <reference key="object" ref="1056857174"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">145</int>
- <reference key="object" ref="342932134"/>
- <reference key="parent" ref="110575045"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">130</int>
- <reference key="object" ref="752062318"/>
- <reference key="parent" ref="1046388886"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="835318025"/>
- <array class="NSMutableArray" key="children">
- <reference ref="299356726"/>
- <reference ref="625202149"/>
- <reference ref="575023229"/>
- <reference ref="1011231497"/>
- <reference ref="86356408"/>
- </array>
- <reference key="parent" ref="713487014"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">92</int>
- <reference key="object" ref="299356726"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="625202149"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">239</int>
- <reference key="object" ref="575023229"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="1011231497"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">711</int>
- <reference key="object" ref="725688984"/>
- <array class="NSMutableArray" key="children">
- <reference ref="701759256"/>
- </array>
- <reference key="parent" ref="649796088"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">712</int>
- <reference key="object" ref="701759256"/>
- <array class="NSMutableArray" key="children">
- <reference ref="521487141"/>
- <reference ref="668936019"/>
- <reference ref="383018193"/>
- <reference ref="984623395"/>
- <reference ref="656529582"/>
- <reference ref="1032676691"/>
- <reference ref="538907583"/>
- </array>
- <reference key="parent" ref="725688984"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">716</int>
- <reference key="object" ref="984623395"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">717</int>
- <reference key="object" ref="656529582"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">718</int>
- <reference key="object" ref="1032676691"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">721</int>
- <reference key="object" ref="538907583"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">824</int>
- <reference key="object" ref="756173070"/>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">841</int>
- <reference key="object" ref="86356408"/>
- <reference key="parent" ref="835318025"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">828</int>
- <reference key="object" ref="110292814"/>
- <array class="NSMutableArray" key="children">
- <reference ref="305280978"/>
- </array>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">829</int>
- <reference key="object" ref="305280978"/>
- <array class="NSMutableArray" key="children"/>
- <reference key="parent" ref="110292814"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">713</int>
- <reference key="object" ref="521487141"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">714</int>
- <reference key="object" ref="668936019"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">715</int>
- <reference key="object" ref="383018193"/>
- <reference key="parent" ref="701759256"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">941</int>
- <reference key="object" ref="979091056"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1044753903"/>
- </array>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">942</int>
- <reference key="object" ref="1044753903"/>
- <array class="NSMutableArray" key="children">
- <reference ref="238626476"/>
- </array>
- <reference key="parent" ref="979091056"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">943</int>
- <reference key="object" ref="238626476"/>
- <array class="NSMutableArray" key="children">
- <reference ref="395788163"/>
- <reference ref="1067057765"/>
- <reference ref="339833963"/>
- </array>
- <reference key="parent" ref="1044753903"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">944</int>
- <reference key="object" ref="395788163"/>
- <reference key="parent" ref="238626476"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">945</int>
- <reference key="object" ref="1067057765"/>
- <reference key="parent" ref="238626476"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">946</int>
- <reference key="object" ref="339833963"/>
- <reference key="parent" ref="238626476"/>
- </object>
- </array>
- </object>
- <dictionary class="NSMutableDictionary" key="flattenedProperties">
- <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="711.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="712.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="713.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="714.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="715.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="716.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="717.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="718.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="721.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="824.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="YES" key="828.IBNSWindowAutoPositionCentersHorizontal"/>
- <boolean value="YES" key="828.IBNSWindowAutoPositionCentersVertical"/>
- <string key="828.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="YES" key="828.NSWindowTemplate.visibleAtLaunch"/>
- <string key="829.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="841.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="941.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <boolean value="NO" key="941.NSWindowTemplate.visibleAtLaunch"/>
- <string key="942.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="943.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="944.CustomClassName">LLNonInlineTextView</string>
- <string key="944.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="945.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="946.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
- <nil key="activeLocalization"/>
- <dictionary class="NSMutableDictionary" key="localizations"/>
- <nil key="sourceID"/>
- <int key="maxID">954</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <array class="NSMutableArray" key="referencedPartialClassDescriptions">
- <object class="IBPartialClassDescription">
- <string key="className">LLAppDelegate</string>
- <string key="superclassName">NSObject</string>
- <dictionary class="NSMutableDictionary" key="outlets">
- <string key="inputView">LLNonInlineTextView</string>
- <string key="inputWindow">NSWindow</string>
- <string key="window">LLNSWindow</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
- <object class="IBToOneOutletInfo" key="inputView">
- <string key="name">inputView</string>
- <string key="candidateClassName">LLNonInlineTextView</string>
- </object>
- <object class="IBToOneOutletInfo" key="inputWindow">
- <string key="name">inputWindow</string>
- <string key="candidateClassName">NSWindow</string>
- </object>
- <object class="IBToOneOutletInfo" key="window">
- <string key="name">window</string>
- <string key="candidateClassName">LLNSWindow</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLAppDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLNSWindow</string>
- <string key="superclassName">NSWindow</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLNSWindow.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLNonInlineTextView</string>
- <string key="superclassName">NSTextView</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLNonInlineTextView.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">LLUserInputWindow</string>
- <string key="superclassName">NSPanel</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/LLUserInputWindow.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSTextView</string>
- <dictionary class="NSMutableDictionary" key="actions">
- <string key="orderFrontSharingServicePicker:">id</string>
- <string key="toggleQuickLookPreviewPanel:">id</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="actionInfosByName">
- <object class="IBActionInfo" key="orderFrontSharingServicePicker:">
- <string key="name">orderFrontSharingServicePicker:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="toggleQuickLookPreviewPanel:">
- <string key="name">toggleQuickLookPreviewPanel:</string>
- <string key="candidateClassName">id</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/NSTextView.h</string>
- </object>
- </object>
- </array>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <real value="1060" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
- <integer value="4600" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NSMenuCheckmark">{11, 11}</string>
- <string key="NSMenuMixedState">{10, 3}</string>
- </dictionary>
- </data>
-</archive>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <deployment version="110000" identifier="macosx"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23504"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+ <connections>
+ <outlet property="delegate" destination="824" id="845"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+ <menu title="Main Menu" systemMenu="main" id="29" userLabel="Main Menu">
+ <items>
+ <menuItem title="Second Life" id="56">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Second Life" systemMenu="apple" id="57">
+ <items>
+ <menuItem title="About Second Life" id="58">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="236"/>
+ <menuItem title="Preferences…" keyEquivalent="," id="129"/>
+ <menuItem isSeparatorItem="YES" id="143"/>
+ <menuItem title="Services" id="131">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Services" systemMenu="services" id="130"/>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="144"/>
+ <menuItem title="Hide Second Life" keyEquivalent="h" id="134">
+ <connections>
+ <action selector="hide:" target="-1" id="369"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Hide Others" keyEquivalent="h" id="145">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="hideOtherApplications:" target="-1" id="370"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Show All" id="150">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="unhideAllApplications:" target="-1" id="372"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="149"/>
+ <menuItem title="Quit Second Life" keyEquivalent="q" id="136">
+ <connections>
+ <action selector="terminate:" target="-3" id="823"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Edit" id="711">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Edit" id="712">
+ <items>
+ <menuItem title="Undo" keyEquivalent="z" id="713">
+ <connections>
+ <action selector="undo:" target="-1" id="776"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Redo" keyEquivalent="Z" id="714"/>
+ <menuItem isSeparatorItem="YES" id="715"/>
+ <menuItem title="Cut" keyEquivalent="x" id="716">
+ <connections>
+ <action selector="cut:" target="-1" id="768"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Copy" keyEquivalent="c" id="717">
+ <connections>
+ <action selector="copy:" target="-1" id="782"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Paste" keyEquivalent="v" id="718">
+ <connections>
+ <action selector="paste:" target="-1" id="769"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Select All" keyEquivalent="a" id="721">
+ <connections>
+ <action selector="selectAll:" target="-1" id="785"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Window" id="19">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Window" systemMenu="window" id="24">
+ <items>
+ <menuItem title="Minimize" keyEquivalent="m" id="23">
+ <connections>
+ <action selector="performMiniaturize:" target="-1" id="37"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Zoom" id="239">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="performZoom:" target="-1" id="240"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Enter Full Screen" keyEquivalent="f" id="841">
+ <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
+ <connections>
+ <action selector="toggleFullScreen:" target="-1" id="842"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="92"/>
+ <menuItem title="Bring All to Front" id="5">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="arrangeInFront:" target="-1" id="39"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Help" id="103">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ </menuItem>
+ </items>
+ <point key="canvasLocation" x="87" y="149"/>
+ </menu>
+ <customObject id="824" customClass="LLAppDelegate">
+ <connections>
+ <outlet property="inputView" destination="944" id="954"/>
+ <outlet property="inputWindow" destination="941" id="953"/>
+ <outlet property="window" destination="828" id="850"/>
+ </connections>
+ </customObject>
+ <window title="Second Life" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" deferred="NO" frameAutosaveName="Second Life" animationBehavior="default" id="828" customClass="LLNSWindow">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+ <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
+ <rect key="contentRect" x="196" y="240" width="1024" height="600"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1728" height="1079"/>
+ <view key="contentView" id="829">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="600"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </view>
+ <point key="canvasLocation" x="-48" y="-285"/>
+ </window>
+ <window title="Input Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" animationBehavior="default" id="941" customClass="LLUserInputWindow">
+ <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/>
+ <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+ <rect key="contentRect" x="272" y="176" width="938" height="42"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1728" height="1079"/>
+ <view key="contentView" id="942">
+ <rect key="frame" x="0.0" y="0.0" width="938" height="42"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <scrollView fixedFrame="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="943">
+ <rect key="frame" x="-1" y="-1" width="940" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <clipView key="contentView" id="Mvi-Vb-2zK">
+ <rect key="frame" x="1" y="1" width="923" height="42"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" spellingCorrection="YES" smartInsertDelete="YES" id="944" customClass="LLNonInlineTextView">
+ <rect key="frame" x="0.0" y="0.0" width="923" height="42"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+ <size key="minSize" width="923" height="42"/>
+ <size key="maxSize" width="940" height="10000000"/>
+ <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
+ </textView>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </clipView>
+ <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="945">
+ <rect key="frame" x="-100" y="-100" width="87" height="18"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ <scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="946">
+ <rect key="frame" x="924" y="1" width="15" height="42"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </scroller>
+ </scrollView>
+ </subviews>
+ </view>
+ <point key="canvasLocation" x="87" y="144"/>
+ </window>
+ </objects>
+</document>
diff --git a/indra/newview/app_settings/message.xml b/indra/newview/app_settings/message.xml
new file mode 100755
index 0000000000..dee3fd72dd
--- /dev/null
+++ b/indra/newview/app_settings/message.xml
@@ -0,0 +1,751 @@
+<?xml version="1.0"?>
+<llsd>
+ <map>
+ <key>serverDefaults</key>
+ <!--
+ a map of server names to default message transport
+ -->
+ <map>
+ <key>simulator</key>
+ <string>template</string>
+
+ <key>spaceserver</key>
+ <string>template</string>
+
+ <key>dataserver</key>
+ <string>template</string>
+
+ <key>logDataserver</key>
+ <string>template</string>
+
+ <key>inventoryDataserver</key>
+ <string>template</string>
+
+ <key>rpcserver</key>
+ <string>template</string>
+
+ <key>mapserver</key>
+ <string>template</string>
+
+ <key>viewer</key>
+ <string>template</string>
+
+ </map>
+ <key>messages</key>
+ <!--
+ a map of individual message names that override defaults
+ -->
+ <map>
+ <!--
+ Circuit related messages
+ -->
+ <key>PacketAck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>OpenCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CloseCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>StartPingCheck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CompletePingCheck</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AddCircuitCode</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>UseCircuitCode</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>CreateTrustedCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RequestTrustedCircuit</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!--
+ Simulator to Launcher
+ until we get a HTTP server in the launcher
+ -->
+ <key>ReportAutosaveCrash</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>SetCPURatio</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Viewer to simulator messages sent before UntrustedSimulatorMessage cap received.
+ -->
+ <key>CompleteAgentMovement</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>EconomyDataRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ViewerEffect</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RegionHandshakeReply</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Viewer to simulator messages sent unreliably.
+ -->
+ <key>AgentUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!--
+ Messages created by LLThrottleGroup clients
+ -->
+ <key>ImagePacket</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>LayerData</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdateCached</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdateCompressed</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ImprovedTerseObjectUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AvatarAnimation</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectAnimation</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>AvatarAppearance</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Simulator to simulator reliable messages -->
+ <key>GodKickUser</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RoutedMoneyBalanceReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Simulator to simulator unreliable messages -->
+ <key>EdgeDataPacket</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>CoarseLocationUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ <key>only-send-latest</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SimulatorLoad</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>EstablishAgentCommunication</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentGroupDataUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentDropGroup</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionStartReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionEventReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ForceCloseChatterBoxSession</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionAgentListUpdates</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxSessionUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ChatterBoxInvitation</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!-- Client to server -->
+ <key>ParcelVoiceInfoRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <!-- Server to client -->
+ <key>DisplayNameUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelVoiceInfo</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelNavigateMedia</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ParcelObjectOwnersReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>ParcelProperties</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>LandStatReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>PlacesReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SetDisplayNameReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>SimConsoleResponse</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>DirLandReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>avatarnotesrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-notes</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>avatarclassifiedsrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-classifieds</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>avatarpicksrequest</key>
+ <map>
+ <key>service_name</key>
+ <string>avatar-pick</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>pickinforequest</key>
+ <map>
+ <key>service_name</key>
+ <string>pick-info</string>
+ <key>builder</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ProvisionVoiceAccountRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>VoiceSignalingRequest</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+ <!-- Server to client -->
+ <key>RequiredVoiceVersion</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>EnableSimulator</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>TeleportFinish</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>TeleportFailed</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>CrossedRegion</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>NavMeshStatusUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <key>AgentStateUpdate</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ <!-- UDPDeprecated Messages -->
+ <key>ScriptRunningReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>LandStatReply</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>StartGroupProposal</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>FetchInventoryDescendents</key>
+ <map>
+ <key>flavor</key>
+ <string>template</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>GroupProposalBallot</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>RpcScriptRequestInboundForward</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>false</boolean>
+ </map>
+
+ <key>ObjectPhysicsProperties</key>
+ <map>
+ <key>flavor</key>
+ <string>llsd</string>
+ <key>trusted-sender</key>
+ <boolean>true</boolean>
+ </map>
+
+ </map>
+ <key>capBans</key>
+ <map>
+ <key>MapLayer</key>
+ <boolean>false</boolean>
+
+ <key>MapLayerGod</key>
+ <boolean>false</boolean>
+
+ <key>NewFileAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateGestureAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateNotecardAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateScriptAgentInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateGestureTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateNotecardTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>UpdateScriptTaskInventory</key>
+ <boolean>false</boolean>
+
+ <key>ViewerStartAuction</key>
+ <boolean>true</boolean>
+
+ <key>ParcelGodReserveForNewbie</key>
+ <boolean>true</boolean>
+
+ <key>SendUserReport</key>
+ <boolean>false</boolean>
+
+ <key>SendUserReportWithScreenshot</key>
+ <boolean>false</boolean>
+
+ <key>RequestTextureDownload</key>
+ <boolean>true</boolean>
+
+ <key>EventQueueGet</key>
+ <boolean>false</boolean>
+
+ <key>UntrustedSimulatorMessage</key>
+ <boolean>false</boolean>
+
+ <key>SendPostcard</key>
+ <boolean>false</boolean>
+
+ <key>SendPostcard2</key>
+ <boolean>true</boolean>
+
+ <key>SendPostcard3</key>
+ <boolean>true</boolean>
+
+ <key>ParcelVoiceInfoRequest</key>
+ <boolean>false</boolean>
+
+ <key>ChatSessionRequest</key>
+ <boolean>false</boolean>
+
+ <key>ProvisionVoiceAccountRequest</key>
+ <boolean>false</boolean>
+
+ <key>VoiceSignalingRequest</key>
+ <boolean>false</boolean>
+
+ <key>RemoteParcelRequest</key>
+ <boolean>false</boolean>
+
+ <key>SearchStatTracking</key>
+ <boolean>false</boolean>
+
+ <key>ParcelPropertiesUpdate</key>
+ <boolean>false</boolean>
+
+ <key>EstateChangeInfo</key>
+ <boolean>true</boolean>
+
+ <key>FetchInventoryDescendents2</key>
+ <boolean>false</boolean>
+
+ <key>FetchInventory2</key>
+ <boolean>false</boolean>
+
+ <key>FetchLibDescendents2</key>
+ <boolean>false</boolean>
+
+ <key>FetchLib2</key>
+ <boolean>false</boolean>
+
+ <key>UploadBakedTexture</key>
+ <boolean>true</boolean>
+
+ <key>ObjectMedia</key>
+ <boolean>false</boolean>
+
+ <key>ObjectMediaNavigate</key>
+ <boolean>false</boolean>
+
+ </map>
+
+ <key>messageBans</key>
+ <map>
+ <key>trusted</key>
+ <map>
+ </map>
+
+ <key>untrusted</key>
+ <map>
+ </map>
+ </map>
+
+ <key>maxQueuedEvents</key>
+ <integer>100</integer>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f4158188ad..d64f82d303 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1159,7 +1159,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowDiscordActivityDetails</key>
<map>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
index 017855325c..8e12d09443 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl
@@ -2545,12 +2545,31 @@ A_STATIC void CasSetup(
#endif
#ifdef A_GPU
+
+#ifdef LEGACY_GAMMA
+uniform float gamma;
+
+vec3 legacyGamma(vec3 color)
+{
+ vec3 c = 1. - clamp(color, vec3(0.), vec3(1.));
+ c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side
+
+ return c;
+}
+#endif
+
void main()
{
vec4 diff = vec4(0.f);
uvec2 point = uvec2(vary_fragcoord * out_screen_res.xy);
CasFilter(diff.r, diff.g, diff.b, point, cas_param_0, cas_param_1, true);
diff.a = texture(diffuseRect, vary_fragcoord).a;
+ diff.rgb = linear_to_srgb(diff.rgb);
+
+#ifdef LEGACY_GAMMA
+ diff.rgb = legacyGamma(diff.rgb);
+#endif
+
frag_color = diff;
}
#endif
diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
index fdb77cce6e..5837308965 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
@@ -1351,6 +1351,10 @@ float4 SMAABlendingWeightCalculationPS(float2 texcoord,
//-----------------------------------------------------------------------------
// Neighborhood Blending Pixel Shader (Third Pass)
+vec3 srgb_to_linear(vec3 cs);
+vec4 srgb_to_linear4(vec4 cs);
+vec3 linear_to_srgb(vec3 cl);
+
float4 SMAANeighborhoodBlendingPS(float2 texcoord,
float4 offset,
SMAATexture2D(colorTex),
@@ -1369,6 +1373,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
SMAA_BRANCH
if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {
float4 color = SMAASampleLevelZero(colorTex, texcoord);
+ color.rgb = srgb_to_linear(color.rgb);
#if SMAA_REPROJECTION
float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord));
@@ -1377,6 +1382,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ color.rgb = linear_to_srgb(color.rgb);
return color;
} else {
bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)
@@ -1393,8 +1399,13 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
// We exploit bilinear filtering to mix current pixel with the chosen
// neighbor:
- float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);
- color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ float4 color = SMAASampleLevelZero(colorTex, blendingCoord.xy);
+ color.rgb = srgb_to_linear(color.rgb);
+ color = blendingWeight.x * color;
+
+ float4 color2 = SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ color2.rgb = srgb_to_linear(color2.rgb);
+ color += blendingWeight.y * color2;
#if SMAA_REPROJECTION
// Antialias velocity for proper reprojection in a later stage:
@@ -1405,6 +1416,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ color.rgb = linear_to_srgb(color.rgb);
return color;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 4ccc6f54a8..d7a47ef8cd 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -43,8 +43,6 @@ vec3 legacyGamma(vec3 color)
return c;
}
-vec3 clampHDRRange(vec3 color);
-
void main()
{
//this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)
@@ -55,7 +53,7 @@ void main()
diff.rgb = legacyGamma(diff.rgb);
#endif
- diff.rgb = clampHDRRange(diff.rgb);
+ diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0));
frag_color = diff;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl
index 1f01c7f16a..b1218d61af 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl
@@ -31,11 +31,25 @@ uniform sampler2D diffuseRect;
in vec2 vary_fragcoord;
+#ifdef GAMMA_CORRECT
+uniform float gamma;
+#endif
+
vec3 linear_to_srgb(vec3 cl);
vec3 toneMap(vec3 color);
vec3 clampHDRRange(vec3 color);
+#ifdef GAMMA_CORRECT
+vec3 legacyGamma(vec3 color)
+{
+ vec3 c = 1. - clamp(color, vec3(0.), vec3(1.));
+ c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side
+
+ return c;
+}
+#endif
+
void main()
{
//this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)
@@ -47,8 +61,18 @@ void main()
diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0));
#endif
- diff.rgb = clampHDRRange(diff.rgb);
+#ifdef GAMMA_CORRECT
+ diff.rgb = linear_to_srgb(diff.rgb);
+
+#ifdef LEGACY_GAMMA
+ diff.rgb = legacyGamma(diff.rgb);
+#endif
+
+#endif
+
+ diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0)); // We should always be 0-1 past this point
+
//debugExposure(diff.rgb);
- frag_color = max(diff, vec4(0));
+ frag_color = diff;
}
diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp
index e24aea4a28..28f30ae1c9 100644
--- a/indra/newview/gltf/asset.cpp
+++ b/indra/newview/gltf/asset.cpp
@@ -589,7 +589,9 @@ bool Asset::prep()
for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
{
+#ifdef SHOW_ASSERT
U32 attribute_mask = 0;
+#endif
// for each mesh
for (auto& mesh : mMeshes)
{
@@ -607,7 +609,9 @@ bool Asset::prep()
// all primitives of a given variant and material should all have the same attribute mask
llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
+#ifdef SHOW_ASSERT
attribute_mask |= primitive.mAttributeMask;
+#endif
}
}
}
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 77f24ac6a6..0e36698018 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -164,6 +164,74 @@ Var DO_UNINSTALL_V2 # If non-null, path to a previous Viewer 2 installation
!include "x64.nsh" # for 64bit detection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Substring function
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+!define StrStr "!insertmacro StrStr"
+
+!macro StrStr ResultVar String SubString
+ Push `${String}`
+ Push `${SubString}`
+ Call StrStr
+ Pop `${ResultVar}`
+!macroend
+
+Function StrStr
+
+# After this point:
+# ------------------------------------------
+# $R0 = SubString (input)
+# $R1 = String (input)
+# $R2 = SubStringLen (temp)
+# $R3 = StrLen (temp)
+# $R4 = StartCharPos (temp)
+# $R5 = TempStr (temp)
+# function from nsis.sourceforge.io/StrStr
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ ;Get "String" and "SubString" length
+ StrLen $R2 $R0
+ StrLen $R3 $R1
+ ;Start "StartCharPos" counter
+ StrCpy $R4 0
+
+ ;Loop until "SubString" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $R5 $R1 $R2 $R4
+
+ ;Compare "TempStr" with "SubString"
+ ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}
+ ;If not "SubString", this could be "String"'s end
+ ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $R4 $R4 + 1
+ ${Loop}
+
+# After this point:
+# ------------------------------------------
+# $R0 = ResultVar (output)
+
+ ;Remove part before "SubString" on "String" (if there has one)
+ StrCpy $R0 $R1 `` $R4
+
+ ;Return output to user
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Pre-directory page callback
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function dirPre
@@ -190,15 +258,31 @@ Function .onInit
# However, SL-10506 complains about the resulting behavior, so the logic below
# is adapted from before we introduced MultiUser.nsh.
+# Check if user specified /D= on the command line
+System::Call 'kernel32::GetCommandLine()t .r0'
+Push $0
+Push " /D="
+Call StrStr
+Pop $1
+${If} $1 != ""
+ # /D= was specified, extract the path
+ # spaces are allowed in path after /D=, it's expected to be the last parameter
+ StrLen $2 $1
+ StrCpy $INSTDIR $1 $2 4 # Skip over " /D="
+ Goto after_instdir
+${EndIf}
+
# if $0 is empty, this is the first time for this viewer name
ReadRegStr $0 SHELL_CONTEXT "${INSTNAME_KEY}" ""
# viewer with this name was installed before
${If} $0 != ""
- # use the value we got from registry as install location
+ # use the value we got from registry as install location
StrCpy $INSTDIR $0
${EndIf}
+after_instdir:
+
Call CheckCPUFlags # Make sure we have SSE2 support
Call CheckWindowsVersion # Don't install On unsupported systems
Push $0
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 339656089c..b2c66b1bac 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1752,7 +1752,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor()
LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
{
// Compute base camera position and look-at points.
- F32 camera_land_height;
LLVector3d frame_center_global = !isAgentAvatarValid() ?
gAgent.getPositionGlobal() :
gAgent.getPosGlobalFromAgent(getAvatarRootPosition());
@@ -1989,10 +1988,11 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
}
}
- // Don't let camera go underground
- F32 camera_min_off_ground = getCameraMinOffGround();
- camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
- F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground);
+ // Don't let camera go underground if constrained
+ // If not constrained, permit going 1000m below 0, use case: retrieving objects
+ F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints
+ F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
+ F32 minZ = camera_land_height + camera_min_off_ground;
if (camera_position_global.mdV[VZ] < minZ)
{
camera_position_global.mdV[VZ] = minZ;
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index d4b05dde72..b8fd3dc189 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -372,7 +372,7 @@ struct AttachmentInfo
- (void)sendEvent:(NSEvent *)event
{
[super sendEvent:event];
- if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask))
+ if ([event type] == NSEventTypeKeyUp && ([event modifierFlags] & NSEventModifierFlagCommand))
{
[[self keyWindow] sendEvent:event];
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 66dadf7545..63d364eaa8 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -993,6 +993,7 @@ bool LLAppViewer::init()
return false;
}
+#if defined(LL_X86) || defined(LL_X86_64)
// Without SSE2 support we will crash almost immediately, warn here.
if (!gSysCPU.hasSSE2())
{
@@ -1004,6 +1005,7 @@ bool LLAppViewer::init()
// quit immediately
return false;
}
+#endif
// alert the user if they are using unsupported hardware
if (!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
@@ -1289,7 +1291,7 @@ 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");
@@ -1352,6 +1354,7 @@ bool LLAppViewer::doFrame()
#endif
LL_RECORD_BLOCK_TIME(FTM_FRAME);
+ LL_PROFILE_GPU_ZONE("Frame");
{
// and now adjust the visuals from previous frame.
if(LLPerfStats::tunables.userAutoTuneEnabled && LLPerfStats::tunables.tuningFlag != LLPerfStats::Tunables::Nothing)
@@ -1441,24 +1444,26 @@ bool LLAppViewer::doFrame()
if (!LLApp::isExiting())
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df JoystickKeyboard");
- pingMainloopTimeout("Main:JoystickKeyboard");
-
- // Scan keyboard for movement keys. Command keys and typing
- // are handled by windows callbacks. Don't do this until we're
- // done initializing. JC
- if (gViewerWindow
- && (gHeadlessClient || gViewerWindow->getWindow()->getVisible())
- && gViewerWindow->getActive()
- && !gViewerWindow->getWindow()->getMinimized()
- && LLStartUp::getStartupState() == STATE_STARTED
- && (gHeadlessClient || !gViewerWindow->getShowProgress())
- && !gFocusMgr.focusLocked())
{
- LLPerfStats::RecordSceneTime T (LLPerfStats::StatType_t::RENDER_IDLE);
- joystick->scanJoystick();
- gKeyboard->scanKeyboard();
- gViewerInput.scanMouse();
+ LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df JoystickKeyboard");
+ pingMainloopTimeout("Main:JoystickKeyboard");
+
+ // Scan keyboard for movement keys. Command keys and typing
+ // are handled by windows callbacks. Don't do this until we're
+ // done initializing. JC
+ if (gViewerWindow
+ && (gHeadlessClient || gViewerWindow->getWindow()->getVisible())
+ && gViewerWindow->getActive()
+ && !gViewerWindow->getWindow()->getMinimized()
+ && LLStartUp::getStartupState() == STATE_STARTED
+ && (gHeadlessClient || !gViewerWindow->getShowProgress())
+ && !gFocusMgr.focusLocked())
+ {
+ LLPerfStats::RecordSceneTime T(LLPerfStats::StatType_t::RENDER_IDLE);
+ joystick->scanJoystick();
+ gKeyboard->scanKeyboard();
+ gViewerInput.scanMouse();
+ }
}
// Update state based on messages, user input, object idle.
@@ -3167,17 +3172,6 @@ bool LLAppViewer::initWindow()
LLNotificationsUI::LLNotificationManager::getInstance();
-
-#ifdef LL_DARWIN
- //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
- LLOSInfo& os_info = LLOSInfo::instance();
- if (os_info.mMajorVer == 10 && os_info.mMinorVer < 7)
- {
- if ( os_info.mMinorVer == 6 && os_info.mBuild < 8 )
- gViewerWindow->getWindow()->setOldResize(true);
- }
-#endif
-
if (gSavedSettings.getBOOL("WindowMaximized"))
{
gViewerWindow->getWindow()->maximize();
@@ -3292,6 +3286,11 @@ LLSD LLAppViewer::getViewerInfo() const
info["VIEWER_VERSION_STR"] = versionInfo.getVersion();
info["CHANNEL"] = versionInfo.getChannel();
info["ADDRESS_SIZE"] = ADDRESS_SIZE;
+#if LL_ARM64
+ info["ARCHITECTURE"] = "ARM";
+#else
+ info["ARCHITECTURE"] = "x86";
+#endif
std::string build_config = versionInfo.getBuildConfig();
if (build_config != "Release")
{
@@ -3383,7 +3382,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["FONT_SIZE_ADJUSTMENT"] = gSavedSettings.getF32("FontScreenDPI");
info["UI_SCALE"] = gSavedSettings.getF32("UIScaleFactor");
info["DRAW_DISTANCE"] = gSavedSettings.getF32("RenderFarClip");
- info["NET_BANDWITH"] = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ info["NET_BANDWITH"] = LLViewerThrottle::getMaxBandwidthKbps();
info["LOD_FACTOR"] = gSavedSettings.getF32("RenderVolumeLODFactor");
info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance");
info["TEXTURE_MEMORY"] = LLSD::Integer(gGLManager.mVRAM);
@@ -4426,6 +4425,9 @@ bool LLAppViewer::initCache()
const U32 CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS = 128;
LLVOCache::getInstance()->initCache(LL_PATH_CACHE, CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS, getObjectCacheVersion());
+ // Remove old, stale CEF cache folders
+ purgeCefStaleCaches();
+
return true;
}
@@ -4450,18 +4452,27 @@ void LLAppViewer::loadKeyBindings()
LLUrlRegistry::instance().setKeybindingHandler(&gViewerInput);
}
+// As per GHI #4498, remove old, stale CEF cache folders from previous sessions
+void LLAppViewer::purgeCefStaleCaches()
+{
+ // TODO: we really shouldn't use a hard coded name for the cache folder here...
+ const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
+ if (LLFile::isdir(browser_parent_cache))
+ {
+ // This is a sledgehammer approach - nukes the cef_cache dir entirely
+ // which is then recreated the first time a CEF instance creates an
+ // individual cache folder. If we ever decide to retain some folders
+ // e.g. Search UI cache - then we will need a more granular approach.
+ gDirUtilp->deleteDirAndContents(browser_parent_cache);
+ }
+}
+
void LLAppViewer::purgeCache()
{
LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
LLViewerShaderMgr::instance()->clearShaderCache();
- std::string browser_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
- if (LLFile::isdir(browser_cache))
- {
- // cef does not support clear_cache and clear_cookies, so clear what we can manually.
- gDirUtilp->deleteDirAndContents(browser_cache);
- }
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), "*");
}
@@ -4530,6 +4541,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)
}
else
{
+ sendSimpleLogoutRequest();
args["MESSAGE"] = big_reason;
LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
}
@@ -5310,6 +5322,27 @@ void LLAppViewer::sendLogoutRequest()
}
}
+void LLAppViewer::sendSimpleLogoutRequest()
+{
+ if (!mLogoutRequestSent && gMessageSystem)
+ {
+ gLogoutInProgress = true;
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_LogoutRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gAgent.sendReliableMessage();
+
+ LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL;
+
+ gLogoutTimer.reset();
+ gLogoutMaxTime = LOGOUT_REQUEST_TIME;
+ mLogoutRequestSent = true;
+ }
+}
+
void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * regionp)
{
if (!regionp || !regionp->capabilitiesReceived())
@@ -5625,7 +5658,11 @@ void LLAppViewer::forceErrorBreakpoint()
#ifdef LL_WINDOWS
DebugBreak();
#else
+#if defined(LL_X86) || defined(LL_X86_64)
asm ("int $3");
+#else
+ __builtin_trap();
+#endif
#endif
return;
}
@@ -5929,100 +5966,21 @@ void LLAppViewer::initDiscordSocial()
gDiscordPartyMaxSize = 0;
gDiscordTimestampsStart = time(nullptr);
gDiscordClient = std::make_shared<discordpp::Client>();
- gDiscordClient->SetStatusChangedCallback([](discordpp::Client::Status status, discordpp::Client::Error, int32_t) {
- if (status == discordpp::Client::Status::Ready)
- {
- updateDiscordActivity();
- }
- });
- if (gSavedSettings.getBOOL("EnableDiscord"))
- {
- auto credential = gSecAPIHandler->loadCredential("Discord");
- if (credential.notNull())
- {
- gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
- if (result.Successful())
- gDiscordClient->Connect();
- else
- LL_WARNS("Discord") << result.Error() << LL_ENDL;
- });
- }
- else
- {
- LL_WARNS("Discord") << "Integration was enabled, but no credentials. Disabling integration." << LL_ENDL;
- gSavedSettings.setBOOL("EnableDiscord", false);
- }
- }
+ gDiscordClient->SetApplicationId(1394782217405862001);
+ updateDiscordActivity();
}
-void LLAppViewer::toggleDiscordIntegration(const LLSD& value)
+void LLAppViewer::updateDiscordActivity()
{
- static const uint64_t APPLICATION_ID = 1394782217405862001;
- if (value.asBoolean())
- {
- discordpp::AuthorizationArgs args{};
- args.SetClientId(APPLICATION_ID);
- args.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
- auto codeVerifier = gDiscordClient->CreateAuthorizationCodeVerifier();
- args.SetCodeChallenge(codeVerifier.Challenge());
- gDiscordClient->Authorize(args, [codeVerifier](auto result, auto code, auto redirectUri) {
- if (result.Successful())
- {
- gDiscordClient->GetToken(APPLICATION_ID, code, codeVerifier.Verifier(), redirectUri, [](discordpp::ClientResult result, std::string accessToken, std::string, discordpp::AuthorizationTokenType, int32_t, std::string) {
- if (result.Successful())
- {
- gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [accessToken](discordpp::ClientResult result) {
- if (result.Successful())
- {
- LLSD authenticator = LLSD::emptyMap();
- authenticator["token"] = accessToken;
- gSecAPIHandler->saveCredential(gSecAPIHandler->createCredential("Discord", LLSD::emptyMap(), authenticator), true);
- gDiscordClient->Connect();
- }
- else
- {
- LL_WARNS("Discord") << result.Error() << LL_ENDL;
- }
- });
- }
- else
- {
- LL_WARNS("Discord") << result.Error() << LL_ENDL;
- }
- });
- }
- else
- {
- LL_WARNS("Discord") << result.Error() << LL_ENDL;
- gSavedSettings.setBOOL("EnableDiscord", false);
- }
- });
- }
- else
+ LL_PROFILE_ZONE_SCOPED;
+
+ static LLCachedControl<bool> integration_enabled(gSavedSettings, "EnableDiscord", true);
+ if (!integration_enabled)
{
- gDiscordClient->Disconnect();
- auto credential = gSecAPIHandler->loadCredential("Discord");
- if (credential.notNull())
- {
- gDiscordClient->RevokeToken(APPLICATION_ID, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
- if (result.Successful())
- LL_INFOS("Discord") << "Access token successfully revoked." << LL_ENDL;
- else
- LL_WARNS("Discord") << "No access token to revoke." << LL_ENDL;
- });
- auto cred = new LLCredential("Discord");
- gSecAPIHandler->deleteCredential(cred);
- }
- else
- {
- LL_WARNS("Discord") << "Credentials are already nonexistent." << LL_ENDL;
- }
+ gDiscordClient->ClearRichPresence();
+ return;
}
-}
-void LLAppViewer::updateDiscordActivity()
-{
- LL_PROFILE_ZONE_SCOPED;
discordpp::Activity activity;
activity.SetType(discordpp::ActivityTypes::Playing);
discordpp::ActivityTimestamps timestamps;
@@ -6050,37 +6008,39 @@ void LLAppViewer::updateDiscordActivity()
activity.SetDetails(gDiscordActivityDetails);
}
+ auto agent_pos_region = gAgent.getPositionAgent();
+ S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
+ S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
+ S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
+ F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
+ const F32 FLY_CUTOFF = 6.f;
+ const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
+ const F32 WALK_CUTOFF = 1.5f;
+ const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
+ if (velocity_mag_sq > FLY_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 4;
+ pos_y -= pos_y % 4;
+ }
+ else if (velocity_mag_sq > WALK_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 2;
+ pos_y -= pos_y % 2;
+ }
+
+ std::string location = "Hidden Region";
static LLCachedControl<bool> show_state(gSavedSettings, "ShowDiscordActivityState", false);
if (show_state)
{
- auto agent_pos_region = gAgent.getPositionAgent();
- S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
- S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
- S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
- F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
- const F32 FLY_CUTOFF = 6.f;
- const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
- const F32 WALK_CUTOFF = 1.5f;
- const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
- if (velocity_mag_sq > FLY_CUTOFF_SQ)
- {
- pos_x -= pos_x % 4;
- pos_y -= pos_y % 4;
- }
- else if (velocity_mag_sq > WALK_CUTOFF_SQ)
- {
- pos_x -= pos_x % 2;
- pos_y -= pos_y % 2;
- }
- auto location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
- activity.SetState(location);
-
- discordpp::ActivityParty party;
- party.SetId(location);
- party.SetCurrentSize(gDiscordPartyCurrentSize);
- party.SetMaxSize(gDiscordPartyMaxSize);
- activity.SetParty(party);
+ location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
}
+ activity.SetState(location);
+
+ discordpp::ActivityParty party;
+ party.SetId(location);
+ party.SetCurrentSize(gDiscordPartyCurrentSize);
+ party.SetMaxSize(gDiscordPartyMaxSize);
+ activity.SetParty(party);
gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 14e96afe94..3afde6b9f5 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -220,6 +220,7 @@ public:
void initGeneralThread();
void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
+ void purgeCefStaleCaches(); // Remove old, stale CEF cache folders
void purgeCache(); // Clear the local cache.
void purgeCacheImmediate(); //clear local cache immediately.
S32 updateTextureThreads(F32 max_time);
@@ -253,7 +254,6 @@ public:
#ifdef LL_DISCORD
static void initDiscordSocial();
- static void toggleDiscordIntegration(const LLSD& value);
static void updateDiscordActivity();
static void updateDiscordPartyCurrentSize(int32_t size);
static void updateDiscordPartyMaxSize(int32_t size);
@@ -311,6 +311,10 @@ private:
void sendLogoutRequest();
void disconnectViewer();
+ // Does not create a marker file. For lost network case,
+ // to at least attempt to remove the ghost from the world.
+ void sendSimpleLogoutRequest();
+
// *FIX: the app viewer class should be some sort of singleton, no?
// Perhaps its child class is the singleton and this should be an abstract base.
static LLAppViewer* sInstance;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 1709970156..89d19d180b 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -73,6 +73,11 @@ static void exceptionTerminateHandler()
int main( int argc, char **argv )
{
+ // Call Tracy first thing to have it allocate memory
+ // https://github.com/wolfpld/tracy/issues/196
+ LL_PROFILER_FRAME_END;
+ LL_PROFILER_SET_THREAD_NAME("App");
+
gArgC = argc;
gArgV = argv;
diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h
index d0ae0a7fc2..3fbf4202f1 100644
--- a/indra/newview/llappviewermacosx-objc.h
+++ b/indra/newview/llappviewermacosx-objc.h
@@ -30,9 +30,6 @@
#include <string>
#include <vector>
-//Why? Because BOOL
-void launchApplication(const std::string* app_name, const std::vector<std::string>* args);
-
void force_ns_sxeption();
#endif // LL_LLAPPVIEWERMACOSX_OBJC_H
diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm
index 9b6bfe621b..2ea3f2f171 100644
--- a/indra/newview/llappviewermacosx-objc.mm
+++ b/indra/newview/llappviewermacosx-objc.mm
@@ -33,45 +33,6 @@
#include "llappviewermacosx-objc.h"
-void launchApplication(const std::string* app_name, const std::vector<std::string>* args)
-{
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- if (app_name->empty()) return;
-
- NSMutableString* app_name_ns = [NSMutableString stringWithString:[[NSBundle mainBundle] resourcePath]]; //Path to resource dir
- [app_name_ns appendFormat:@"/%@", [NSString stringWithCString:app_name->c_str()
- encoding:[NSString defaultCStringEncoding]]];
-
- NSMutableArray *args_ns = nil;
- args_ns = [[NSMutableArray alloc] init];
-
- for (int i=0; i < args->size(); ++i)
- {
- NSLog(@"Adding string %s", (*args)[i].c_str());
- [args_ns addObject:
- [NSString stringWithCString:(*args)[i].c_str()
- encoding:[NSString defaultCStringEncoding]]];
- }
-
- NSTask *task = [[NSTask alloc] init];
- NSBundle *bundle = [NSBundle bundleWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:app_name_ns]];
- [task setLaunchPath:[bundle executablePath]];
- [task setArguments:args_ns];
- [task launch];
-
-// NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
-// NSURL *url = [NSURL fileURLWithPath:[workspace fullPathForApplication:app_name_ns]];
-//
-// NSError *error = nil;
-// [workspace launchApplicationAtURL:url options:0 configuration:[NSDictionary dictionaryWithObject:args_ns forKey:NSWorkspaceLaunchConfigurationArguments] error:&error];
- //TODO Handle error
-
- [pool release];
- return;
-}
-
void force_ns_sxeption()
{
NSException *exception = [NSException exceptionWithName:@"Forced NSException" reason:nullptr userInfo:nullptr];
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index aab6d00573..b074c40c17 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -258,6 +258,11 @@ void infos(const std::string& message)
int main( int argc, char **argv )
{
+ // Call Tracy first thing to have it allocate memory
+ // https://github.com/wolfpld/tracy/issues/196
+ LL_PROFILER_FRAME_END;
+ LL_PROFILER_SET_THREAD_NAME("App");
+
// Store off the command line args for use later.
gArgC = argc;
gArgV = argv;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 8477bd3044..6386d0636a 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -253,8 +253,8 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NvAPI_UnicodeString profile_name;
std::string app_name = LLTrans::getString("APP_NAME");
- llutf16string w_app_name = utf8str_to_utf16str(app_name);
- wsprintf(profile_name, L"%s", w_app_name.c_str());
+ std::wstring w_app_name = ll_convert<std::wstring>(app_name);
+ wsprintf(reinterpret_cast<wchar_t*>(profile_name), L"%s", w_app_name.c_str());
NvDRSProfileHandle hProfile = 0;
// (3) Check if we already have an application profile for the viewer
status = NvAPI_DRS_FindProfileByName(hSession, profile_name, &hProfile);
@@ -271,7 +271,7 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_PROFILE profileInfo;
profileInfo.version = NVDRS_PROFILE_VER;
profileInfo.isPredefined = 0;
- wsprintf(profileInfo.profileName, L"%s", w_app_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(profileInfo.profileName), L"%s", w_app_name.c_str());
status = NvAPI_DRS_CreateProfile(hSession, &profileInfo, &hProfile);
if (status != NVAPI_OK)
@@ -286,9 +286,9 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_APPLICATION profile_application;
profile_application.version = NVDRS_APPLICATION_VER;
- llutf16string w_exe_name = utf8str_to_utf16str(exe_name);
+ std::wstring w_exe_name = ll_convert<std::wstring>(exe_name);
NvAPI_UnicodeString profile_app_name;
- wsprintf(profile_app_name, L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(profile_app_name), L"%s", w_exe_name.c_str());
status = NvAPI_DRS_GetApplicationInfo(hSession, hProfile, profile_app_name, &profile_application);
if (status != NVAPI_OK && status != NVAPI_EXECUTABLE_NOT_FOUND)
@@ -304,10 +304,10 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)
NVDRS_APPLICATION application;
application.version = NVDRS_APPLICATION_VER;
application.isPredefined = 0;
- wsprintf(application.appName, L"%s", w_exe_name.c_str());
- wsprintf(application.userFriendlyName, L"%s", w_exe_name.c_str());
- wsprintf(application.launcher, L"%s", w_exe_name.c_str());
- wsprintf(application.fileInFolder, L"%s", "");
+ wsprintf(reinterpret_cast<wchar_t*>(application.appName), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.userFriendlyName), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.launcher), L"%s", w_exe_name.c_str());
+ wsprintf(reinterpret_cast<wchar_t*>(application.fileInFolder), L"%s", "");
status = NvAPI_DRS_CreateApplication(hSession, hProfile, &application);
if (status != NVAPI_OK)
@@ -581,7 +581,7 @@ void LLAppViewerWin32::disableWinErrorReporting()
{
std::string executable_name = gDirUtilp->getExecutableFilename();
- if( S_OK == WerAddExcludedApplication( utf8str_to_utf16str(executable_name).c_str(), FALSE ) )
+ if( S_OK == WerAddExcludedApplication(ll_convert<std::wstring>(executable_name).c_str(), FALSE ) )
{
LL_INFOS() << "WerAddExcludedApplication() succeeded for " << executable_name << LL_ENDL;
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index a966253c2c..1988e2072b 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -189,7 +189,14 @@ public:
std::string url = "secondlife://" + mObjectData["slurl"].asString();
LLUrlAction::teleportToLocation(url);
}
-
+ else if (level == "obj_zoom_in")
+ {
+ LLUUID obj_id = mObjectData["object_id"];
+ if (obj_id.notNull())
+ {
+ handle_zoom_to_object(obj_id);
+ }
+ }
}
bool onObjectIconContextMenuItemVisible(const LLSD& userdata)
@@ -203,6 +210,15 @@ public:
{
return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
}
+ else if (level == "obj_zoom_in")
+ {
+ LLUUID obj_id = mObjectData["object_id"];
+ if (obj_id.notNull())
+ {
+ return nullptr != gObjectList.findObject(mAvatarID);
+ }
+ return false;
+ }
return false;
}
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 550dfeb802..5ac4ce0d52 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -37,6 +37,8 @@
#include "lllocalcliprect.h"
#include "lltrans.h"
#include "llfloaterimnearbychat.h"
+#include "llfloaterworldmap.h"
+#include "llviewermenu.h"
#include "llviewercontrol.h"
#include "llagentdata.h"
@@ -75,6 +77,23 @@ public:
return true;
}
+ if (verb == "zoomin")
+ {
+ if (!handle_zoom_to_object(object_id) && params.size() > 2)
+ {
+ // zoom faled, show location
+ // secondlife:///app/object/object_id/zoomin/{LOCATION}/{COORDS} SLapp
+ const std::string region_name = LLURI::unescape(params[0].asString());
+ S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
+ S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
+ S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
+
+ LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+ return true;
+ }
+
return false;
}
};
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 0e0ab236d6..99d770b6e2 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -543,7 +543,7 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi
{
bool old_value = mIsInActiveVoiceChannel;
mIsInActiveVoiceChannel = vmi->getUUID() == session_id;
- mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel);
+ mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel && !LLVoiceChannel::isSuspended());
if (old_value != mIsInActiveVoiceChannel)
{
refresh();
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 1c8864a9df..46696fc4a4 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -204,7 +204,7 @@ public:
NUM_RENDER_TYPES,
};
- #ifdef LL_PROFILER_ENABLE_RENDER_DOC
+ #if LL_PROFILER_ENABLE_RENDER_DOC
static inline const char* lookupPassName(U32 pass)
{
switch (pass)
@@ -340,7 +340,7 @@ public:
}
}
#else
- static inline const char* lookupPass(U32 pass) { return ""; }
+ static inline const char* lookupPassName(U32 pass) { return ""; }
#endif
LLRenderPass(const U32 type);
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 7d58511d41..cdf3244389 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -143,7 +143,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
gGL.setColorMask(true, true);
LLColor3 light_diffuse(0, 0, 0);
- F32 light_exp = 0.0f;
LLEnvironment& environment = LLEnvironment::instance();
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
@@ -170,7 +169,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
// Apply magic numbers translating light direction into intensities
light_dir.normalize();
F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1];
- light_exp = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f));
if (0.f < light_diffuse.normalize()) // Normalizing a color? Puzzling...
{
light_diffuse *= (1.5f + (6.f * ground_proj_sq));
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 373a556f86..f08ef8d24a 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -767,9 +767,6 @@ static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVect
// Texture transforms are done about the center of the face.
st.setAdd(tex_coord, trans);
- // Handle rotation
- LLVector4a rot_st;
-
// <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng>
LLVector4a s0;
s0.splat(st, 0);
@@ -842,7 +839,6 @@ bool LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
//VECTORIZE THIS
LLMatrix4a mat_vert;
mat_vert.loadu(mat_vert_in);
- LLVector4a new_extents[2];
llassert(less_than_max_mag(face.mExtents[0]));
llassert(less_than_max_mag(face.mExtents[1]));
@@ -2255,8 +2251,6 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
if (joint)
{
- LLVector4a jointPos;
-
LLMatrix4a worldMat;
worldMat.loadu((F32*)&joint->getWorldMatrix().mMatrix[0][0]);
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 41e954b7fa..0e754c9561 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -287,7 +287,7 @@ bool LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
success = GetOpenFileName(&mOFN);
if (success)
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
@@ -353,7 +353,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
// lengths.
if( wcslen(mOFN.lpstrFile) > mOFN.nFileOffset ) /*Flawfinder: ignore*/
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
else
@@ -367,7 +367,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
break;
if (*tptrw == 0)
tptrw++; // shouldn't happen?
- std::string filename = utf16str_to_utf8str(llutf16string(tptrw));
+ std::string filename = ll_convert<std::string>(std::wstring(tptrw));
if (dirname.empty())
dirname = filename + "\\";
else
@@ -413,7 +413,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
mOFN.lpstrFile = mFilesW;
if (!filename.empty())
{
- llutf16string tstring = utf8str_to_utf16str(filename);
+ std::wstring tstring = ll_convert<std::wstring>(filename);
wcsncpy(mFilesW, tstring.c_str(), FILENAME_BUFFER_SIZE); } /*Flawfinder: ignore*/
else
{
@@ -595,7 +595,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
success = GetSaveFileName(&mOFN);
if (success)
{
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ std::string filename = ll_convert<std::string>(std::wstring(mFilesW));
mFiles.push_back(filename);
}
}
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index b21bc724fb..978069457c 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -86,7 +86,7 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st
result = [panel runModal];
- if (result == NSOKButton)
+ if (result == NSModalResponseOK)
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
@@ -173,7 +173,7 @@ std::unique_ptr<std::string> doSaveDialog(const std::string* file,
[panel setNameFieldStringValue: fileName];
[panel setDirectoryURL: url];
if([panel runModal] ==
- NSFileHandlingPanelOKButton)
+ NSModalResponseOK)
{
NSURL* url = [panel URL];
NSString* p = [url path];
@@ -211,7 +211,7 @@ void doSaveDialogModeless(const std::string* file,
[panel beginWithCompletionHandler:^(NSModalResponse result)
{
- if (result == NSOKButton)
+ if (result == NSModalResponseOK)
{
NSURL* url = [panel URL];
NSString* p = [url path];
diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp
index 7e13503103..c5f4a2f0cf 100644
--- a/indra/newview/llfloateremojipicker.cpp
+++ b/indra/newview/llfloateremojipicker.cpp
@@ -1284,7 +1284,7 @@ void LLFloaterEmojiPicker::saveState()
if (!recentlyUsed.empty())
recentlyUsed += ",";
char buffer[32];
- sprintf(buffer, "%u", (U32)emoji);
+ snprintf(buffer, sizeof(buffer), "%u", (U32)emoji);
recentlyUsed += buffer;
if (!--maxCount)
break;
@@ -1301,7 +1301,7 @@ void LLFloaterEmojiPicker::saveState()
if (!frequentlyUsed.empty())
frequentlyUsed += ",";
char buffer[32];
- sprintf(buffer, "%u:%u", (U32)it.first, (U32)it.second);
+ snprintf(buffer, sizeof(buffer), "%u:%u", (U32)it.first, (U32)it.second);
frequentlyUsed += buffer;
if (!--maxCount)
break;
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index 68b11ec92b..871f924316 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -78,7 +78,7 @@ BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr,
// Capable of detecting devices like Oculus Rift
if (device_instance_ptr && pvRef)
{
- std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName));
+ std::string product_name = ll_convert<std::string>(std::wstring(device_instance_ptr->tszProductName));
S32 size = sizeof(GUID);
LLSD::Binary data; //just an std::vector
data.resize(size);
diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp
new file mode 100644
index 0000000000..4abea64302
--- /dev/null
+++ b/indra/newview/llfloatermarketplace.cpp
@@ -0,0 +1,63 @@
+/**
+ * @file llfloatermarketplace.cpp
+ * @brief floater for the Marketplace web site
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatermarketplace.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+
+LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key)
+ : LLFloaterWebContent(key)
+{
+}
+
+LLFloaterMarketplace::~LLFloaterMarketplace()
+{
+}
+
+// just to override LLFloaterWebContent
+void LLFloaterMarketplace::onClose(bool app_quitting)
+{
+}
+
+bool LLFloaterMarketplace::postBuild()
+{
+ LLFloaterWebContent::postBuild();
+ mWebBrowser = getChild<LLMediaCtrl>("marketplace_contents");
+ mWebBrowser->addObserver(this);
+
+ return true;
+}
+
+void LLFloaterMarketplace::openMarketplace()
+{
+ std::string url = gSavedSettings.getString("MarketplaceURL");
+ if (mCurrentURL != url)
+ {
+ mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ }
+}
diff --git a/indra/newview/llfloatermarketplace.h b/indra/newview/llfloatermarketplace.h
new file mode 100644
index 0000000000..9524c94eee
--- /dev/null
+++ b/indra/newview/llfloatermarketplace.h
@@ -0,0 +1,46 @@
+/**
+ * @file llfloatermarketplace.h
+ * @brief floater for the Marketplace web site
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#pragma once
+
+#include "llfloater.h"
+#include "llfloaterwebcontent.h"
+
+class LLFloaterMarketplace:
+ public LLFloaterWebContent
+{
+ friend class LLFloaterReg;
+
+public:
+ void openMarketplace();
+
+private:
+ LLFloaterMarketplace(const LLSD& key);
+ ~LLFloaterMarketplace();
+ bool postBuild() override;
+ void onClose(bool app_quitting) override;
+};
+
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 9fb9c6346e..291f22d78f 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -367,7 +367,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
#ifdef LL_DISCORD
- gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::toggleDiscordIntegration, _2));
+ gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
gSavedSettings.getControl("ShowDiscordActivityDetails")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
gSavedSettings.getControl("ShowDiscordActivityState")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
#endif
@@ -758,6 +758,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Forget previous language changes.
mLanguageChanged = false;
+ mLastQualityLevel = gSavedSettings.getU32("RenderQualityPerformance");
// Display selected maturity icons.
onChangeMaturity();
@@ -1327,6 +1328,33 @@ void LLFloaterPreference::onCommitWindowedMode()
void LLFloaterPreference::onChangeQuality(const LLSD& data)
{
U32 level = (U32)(data.asReal());
+ constexpr U32 LVL_HIGH = 4;
+ if (level >= LVL_HIGH && mLastQualityLevel < level)
+ {
+ constexpr U32 LOW_MEM_THRESHOLD = 4097;
+ U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB();
+ if (total_mem < LOW_MEM_THRESHOLD)
+ {
+ LLSD args;
+ args["TOTAL_MEM"] = LLSD::Integer(total_mem);
+ LLNotificationsUtil::add("PreferenceQualityWithLowMemory", args, LLSD(), [this](const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // If cancel pressed
+ if (option == 1)
+ {
+ constexpr U32 LVL_MED_PLUS = 3;
+ gSavedSettings.setU32("RenderQualityPerformance", LVL_MED_PLUS);
+ mLastQualityLevel = LVL_MED_PLUS;
+ LLFeatureManager::getInstance()->setGraphicsLevel(LVL_MED_PLUS, true);
+ refreshEnabledGraphics();
+ refresh();
+ }
+ }
+ );
+ }
+ }
+ mLastQualityLevel = level;
LLFeatureManager::getInstance()->setGraphicsLevel(level, true);
refreshEnabledGraphics();
refresh();
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index fa9c421a8f..a784d502ef 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -218,6 +218,7 @@ private:
bool mGotPersonalInfo;
bool mLanguageChanged;
bool mAvatarDataInitialized;
+ U32 mLastQualityLevel = 0;
std::string mPriorInstantMessageLogPath;
bool mOriginalHideOnlineStatus;
@@ -237,7 +238,7 @@ private:
std::unique_ptr< ll::prefs::SearchData > mSearchData;
bool mSearchDataDirty;
- boost::signals2::connection mImpostorsChangedSignal;
+ boost::signals2::connection mImpostorsChangedSignal;
boost::signals2::connection mComplexityChangedSignal;
void onUpdateFilterTerm( bool force = false );
diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.h b/indra/newview/llfloaterpreferencesgraphicsadvanced.h
index a1a54f238d..6f793c1379 100644
--- a/indra/newview/llfloaterpreferencesgraphicsadvanced.h
+++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.h
@@ -61,7 +61,7 @@ protected:
void onBtnOK(const LLSD& userdata);
void onBtnCancel(const LLSD& userdata);
- boost::signals2::connection mImpostorsChangedSignal;
+ boost::signals2::connection mImpostorsChangedSignal;
boost::signals2::connection mComplexityChangedSignal;
boost::signals2::connection mComplexityModeChangedSignal;
boost::signals2::connection mLODFactorChangedSignal;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index d3c8bf3451..7ee1b88f05 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -1,11 +1,10 @@
/**
* @file llfloatersearch.cpp
- * @author Martin Reddy
- * @brief Search floater - uses an embedded web browser control
+ * @brief Floater for Search (update 2025, preload)
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,68 +26,48 @@
#include "llviewerprecompiledheaders.h"
+#include "llfloatersearch.h"
+
+#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
-#include "llfloatersearch.h"
-#include "llhttpconstants.h"
#include "llmediactrl.h"
-#include "llnotificationsutil.h"
-#include "lllogininstance.h"
-#include "lluri.h"
-#include "llagent.h"
-#include "llui.h"
+#include "lluictrlfactory.h"
#include "llviewercontrol.h"
#include "llweb.h"
// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
-class LLSearchHandler : public LLCommandHandler
-{
-public:
- // requires trusted browser to trigger
- LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
- bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
- {
- const size_t parts = tokens.size();
+class LLSearchHandler : public LLCommandHandler {
+ public:
+ // requires trusted browser to trigger
+ LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
+ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) {
+ const size_t parts = tokens.size();
+
+ // get the (optional) category for the search
+ std::string collection;
+ if (parts > 0)
+ {
+ collection = tokens[0].asString();
+ }
- // get the (optional) category for the search
- std::string collection;
- if (parts > 0)
- {
- collection = tokens[0].asString();
- }
+ // get the (optional) search string
+ std::string search_text;
+ if (parts > 1)
+ {
+ search_text = tokens[1].asString();
+ }
- // get the (optional) search string
- std::string search_text;
- if (parts > 1)
- {
- search_text = tokens[1].asString();
+ // open the search floater and perform the requested search
+ LLFloaterReg::showInstance("search", llsd::map("collection", collection,"query", search_text));
+ return true;
}
-
- // create the LLSD arguments for the search floater
- LLFloaterSearch::Params p;
- p.search.collection = collection;
- p.search.query = LLURI::unescape(search_text);
-
- // open the search floater and perform the requested search
- LLFloaterReg::showInstance("search", p);
- return true;
- }
};
LLSearchHandler gSearchHandler;
-LLFloaterSearch::SearchQuery::SearchQuery()
-: category("category", ""),
- collection("collection", ""),
- query("query")
-{}
-
-LLFloaterSearch::LLFloaterSearch(const Params& key) :
- LLFloaterWebContent(key),
- mSearchGodLevel(0)
+LLFloaterSearch::LLFloaterSearch(const LLSD& key)
+ : LLFloaterWebContent(key)
{
- // declare a map that transforms a category name into
- // the URL suffix that is used to search that category
-
mSearchType.insert("standard");
mSearchType.insert("land");
mSearchType.insert("classified");
@@ -100,76 +79,53 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :
mCollectionType.insert("people");
}
-bool LLFloaterSearch::postBuild()
+LLFloaterSearch::~LLFloaterSearch()
{
- LLFloaterWebContent::postBuild();
- mWebBrowser->addObserver(this);
-
- return true;
}
-void LLFloaterSearch::onOpen(const LLSD& key)
+void LLFloaterSearch::onOpen(const LLSD& tokens)
{
- Params p(key);
- p.trusted_content = true;
- p.allow_address_entry = false;
-
- LLFloaterWebContent::onOpen(p);
+ initiateSearch(tokens);
mWebBrowser->setFocus(true);
- search(p.search);
}
+// just to override LLFloaterWebContent
void LLFloaterSearch::onClose(bool app_quitting)
{
- LLFloaterWebContent::onClose(app_quitting);
- // tear down the web view so we don't show the previous search
- // result when the floater is opened next time
- destroy();
}
-void LLFloaterSearch::godLevelChanged(U8 godlevel)
+void LLFloaterSearch::initiateSearch(const LLSD& tokens)
{
- // search results can change based upon god level - if the user
- // changes god level, then give them a warning (we don't refresh
- // the search as this might undo any page navigation or
- // AJAX-driven changes since the last search).
+ std::string url = gSavedSettings.getString("SearchURL");
- //FIXME: set status bar text
+ LLSD subs;
- //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel));
-}
+ // Setting this substitution here results in a full set of collections being
+ // substituted into the final URL using the logic from the original search.
+ subs["TYPE"] = "standard";
-void LLFloaterSearch::search(const SearchQuery &p)
-{
- if (! mWebBrowser || !p.validateBlock())
- {
- return;
- }
+ std::string collection = tokens.has("collection") ? tokens["collection"].asString() : "";
- // reset the god level warning as we're sending the latest state
- getChildView("refresh_search")->setVisible(false);
- mSearchGodLevel = gAgent.getGodLevel();
+ std::string search_text = tokens.has("query") ? tokens["query"].asString() : "";
- // work out the subdir to use based on the requested category
- LLSD subs;
- if (mSearchType.find(p.category) != mSearchType.end())
+ std::string category = tokens.has("category") ? tokens["category"].asString() : "";
+ if (mSearchType.find(category) != mSearchType.end())
{
- subs["TYPE"] = p.category;
+ subs["TYPE"] = category;
}
else
{
subs["TYPE"] = "standard";
}
- // add the search query string
- subs["QUERY"] = LLURI::escape(p.query);
+ subs["QUERY"] = LLURI::escape(search_text);
subs["COLLECTION"] = "";
if (subs["TYPE"] == "standard")
{
- if (mCollectionType.find(p.collection) != mCollectionType.end())
+ if (mCollectionType.find(collection) != mCollectionType.end())
{
- subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection);
+ subs["COLLECTION"] = "&collection_chosen=" + std::string(collection);
}
else
{
@@ -182,30 +138,45 @@ void LLFloaterSearch::search(const SearchQuery &p)
}
}
- // add the user's preferred maturity (can be changed via prefs)
- std::string maturity;
+ // Default to PG
+ std::string maturity = "g";
if (gAgent.prefersAdult())
{
- maturity = "gma"; // PG,Mature,Adult
+ // PG,Mature,Adult
+ maturity = "gma";
}
else if (gAgent.prefersMature())
{
- maturity = "gm"; // PG,Mature
- }
- else
- {
- maturity = "g"; // PG
+ // PG,Mature
+ maturity = "gm";
}
subs["MATURITY"] = maturity;
- // add the user's god status
+ // God status
subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
- // get the search URL and expand all of the substitutions
- // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
- std::string url = gSavedSettings.getString("SearchURL");
+ // This call expands a set of generic substitutions like language, viewer version
+ // etc. and then also does the same with the list of subs passed in.
url = LLWeb::expandURLSubstitutions(url, subs);
- // and load the URL in the web view
- mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ // Naviation to the calculated URL - we know it's HTML so we can
+ // tell the media system not to bother with the MIME type check.
+ LLMediaCtrl* search_browser = findChild<LLMediaCtrl>("search_contents");
+ search_browser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+}
+
+bool LLFloaterSearch::postBuild()
+{
+ LLFloaterWebContent::postBuild();
+ mWebBrowser = getChild<LLMediaCtrl>("search_contents");
+ mWebBrowser->addObserver(this);
+ getChildView("address")->setEnabled(false);
+ getChildView("popexternal")->setEnabled(false);
+
+ // This call is actioned by the preload code in llViewerWindow
+ // that creates the search floater during the login process
+ // using a generic search with no query
+ initiateSearch(LLSD());
+
+ return true;
}
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index beaac2ad2f..6d93474f4a 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -1,11 +1,10 @@
/**
* @file llfloatersearch.h
- * @author Martin Reddy
- * @brief Search floater - uses an embedded web browser control
+ * @brief Floater for Search (update 2025, preload)
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,70 +24,25 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLFLOATERSEARCH_H
-#define LL_LLFLOATERSEARCH_H
+#pragma once
+#include "llfloater.h"
#include "llfloaterwebcontent.h"
-#include "llviewermediaobserver.h"
-#include <string>
+class LLFloaterSearch:
+ public LLFloaterWebContent {
+ friend class LLFloaterReg;
-class LLMediaCtrl;
+ public:
+ void onOpen(const LLSD& key) override;
+ void onClose(bool app_quitting) override;
-///
-/// The search floater allows users to perform all search operations.
-/// All search functionality is now implemented via web services and
-/// so this floater simply embeds a web view and displays the search
-/// web page. The browser control is explicitly marked as "trusted"
-/// so that the user can click on teleport links in search results.
-///
-class LLFloaterSearch :
- public LLFloaterWebContent
-{
-public:
- struct SearchQuery : public LLInitParam::Block<SearchQuery>
- {
- Optional<std::string> category;
- Optional<std::string> collection;
- Optional<std::string> query;
+ private:
+ LLFloaterSearch(const LLSD& key);
+ ~LLFloaterSearch();
+ void initiateSearch(const LLSD& tokens);
+ bool postBuild() override;
- SearchQuery();
- };
-
- struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params>
- {
- Optional<SearchQuery> search;
- };
-
- typedef LLSDParamAdapter<_Params> Params;
-
- LLFloaterSearch(const Params& key);
-
- /// show the search floater with a new search
- /// see search() for details on the key parameter.
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void onClose(bool app_quitting);
-
- /// perform a search with the specific search term.
- /// The key should be a map that can contain the following keys:
- /// - "id": specifies the text phrase to search for
- /// - "category": one of "all" (default), "people", "places",
- /// "events", "groups", "wiki", "destinations", "classifieds"
- void search(const SearchQuery &query);
-
- /// changing godmode can affect the search results that are
- /// returned by the search website - use this method to tell the
- /// search floater that the user has changed god level.
- void godLevelChanged(U8 godlevel);
-
-private:
- /*virtual*/ bool postBuild();
-
- std::set<std::string> mSearchType;
- std::set<std::string> mCollectionType;
- U8 mSearchGodLevel;
+ std::set<std::string> mSearchType;
+ std::set<std::string> mCollectionType;
};
-
-#endif // LL_LLFLOATERSEARCH_H
-
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index d8b3f996aa..8da835ed7d 100644
--- a/indra/newview/llgltfmateriallist.cpp
+++ b/indra/newview/llgltfmateriallist.cpp
@@ -45,7 +45,9 @@
#include "llworld.h"
#include "tinygltf/tiny_gltf.h"
-#include <strstream>
+
+#include <boost/iostreams/device/array.hpp>
+#include <boost/iostreams/stream.hpp>
#include <unordered_set>
@@ -555,8 +557,7 @@ void LLGLTFMaterialList::onAssetLoadComplete(const LLUUID& id, LLAssetType::ETyp
LLSD asset;
// read file into buffer
- std::istrstream str(&buffer[0], static_cast<S32>(buffer.size()));
-
+ boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size());
if (LLSDSerialize::deserialize(asset, str, buffer.size()))
{
if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString()))
diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp
index da1f1a466f..5a6e9565ae 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.cpp
+++ b/indra/newview/llgltfmaterialpreviewmgr.cpp
@@ -523,12 +523,12 @@ bool LLGLTFPreviewTexture::render()
gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap);
gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap);
gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false);
- gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap);
+ gPipeline.gammaCorrect(&screen, &gPipeline.mPostPingMap);
LLVertexBuffer::unbind();
- gPipeline.generateGlow(&gPipeline.mPostMap);
- gPipeline.combineGlow(&gPipeline.mPostMap, &screen);
- gPipeline.renderDoF(&screen, &gPipeline.mPostMap);
- gPipeline.applyFXAA(&gPipeline.mPostMap, &screen);
+ gPipeline.generateGlow(&gPipeline.mPostPingMap);
+ gPipeline.combineGlow(&gPipeline.mPostPingMap, &screen);
+ gPipeline.renderDoF(&screen, &gPipeline.mPostPingMap);
+ gPipeline.applyFXAA(&gPipeline.mPostPingMap, &screen);
// *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame)
gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure);
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index 675a8dfe7d..0f3e220ae0 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -92,6 +92,7 @@ void LLHeroProbeManager::update()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hero manager update");
llassert(!gCubeSnapshot); // assert a snapshot is not in progress
if (LLAppViewer::instance()->logoutRequestSent())
{
@@ -293,6 +294,9 @@ void LLHeroProbeManager::renderProbes()
// In effect this simulates single-bounce lighting.
void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool is_dynamic, F32 near_clip)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hero probe update");
+
// hacky hot-swap of camera specific render targets
gPipeline.mRT = &gPipeline.mHeroProbeRT;
@@ -363,7 +367,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool
for (int i = 0; i < mMipChain.size(); ++i)
{
- LL_PROFILE_GPU_ZONE("probe mip");
+ LL_PROFILE_GPU_ZONE("hero probe mip");
mMipChain[i].bindTarget();
if (i == 0)
{
@@ -390,7 +394,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool
if (mip >= 0)
{
- LL_PROFILE_GPU_ZONE("probe mip copy");
+ LL_PROFILE_GPU_ZONE("hero probe mip copy");
mTexture->bind(0);
glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, sourceIdx * 6 + face, 0, 0, res, res);
@@ -438,7 +442,7 @@ void LLHeroProbeManager::generateRadiance(LLReflectionMap* probe)
for (int i = 0; i < mMipChain.size() / 4; ++i)
{
- LL_PROFILE_GPU_ZONE("probe radiance gen");
+ LL_PROFILE_GPU_ZONE("hero probe radiance gen");
static LLStaticHashedString sMipLevel("mipLevel");
static LLStaticHashedString sRoughness("roughness");
static LLStaticHashedString sWidth("u_width");
@@ -485,6 +489,7 @@ void LLHeroProbeManager::updateUniforms()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("hpmu - uniforms")
LLMatrix4a modelview;
modelview.loadu(gGLModelView);
diff --git a/indra/newview/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp
index 31065a3e76..2bb5696f59 100644
--- a/indra/newview/llhudeffectresetskeleton.cpp
+++ b/indra/newview/llhudeffectresetskeleton.cpp
@@ -56,6 +56,15 @@ LLHUDEffectResetSkeleton::~LLHUDEffectResetSkeleton()
//-----------------------------------------------------------------------------
// packData()
//-----------------------------------------------------------------------------
+void LLHUDEffectResetSkeleton::render()
+{
+ // HUDEffectResetSkeleton is a fake effect meant to reset skeleton only.
+ // Just wait for an update() call to do its work and then die.
+}
+
+//-----------------------------------------------------------------------------
+// packData()
+//-----------------------------------------------------------------------------
void LLHUDEffectResetSkeleton::packData(LLMessageSystem *mesgsys)
{
// Pack the default data
diff --git a/indra/newview/llhudeffectresetskeleton.h b/indra/newview/llhudeffectresetskeleton.h
index 39a6137054..c89516d7fc 100644
--- a/indra/newview/llhudeffectresetskeleton.h
+++ b/indra/newview/llhudeffectresetskeleton.h
@@ -38,20 +38,21 @@ class LLHUDEffectResetSkeleton final : public LLHUDEffect
public:
friend class LLHUDObject;
- /*virtual*/ void markDead();
- /*virtual*/ void setSourceObject(LLViewerObject* objectp);
+ /*virtual*/ void markDead() override;
+ /*virtual*/ void setSourceObject(LLViewerObject* objectp) override;
- void setTargetObject(LLViewerObject *objp);
+ void setTargetObject(LLViewerObject *objp) override;
void setResetAnimations(bool enable){ mResetAnimations = enable; };
protected:
LLHUDEffectResetSkeleton(const U8 type);
~LLHUDEffectResetSkeleton();
- /*virtual*/ void packData(LLMessageSystem *mesgsys);
- /*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum);
+ void render() override;
+ void packData(LLMessageSystem *mesgsys) override;
+ void unpackData(LLMessageSystem *mesgsys, S32 blocknum) override;
- void update();
+ void update() override;
private:
bool mResetAnimations;
};
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index d1fd82a7f1..e6b33453d5 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -3890,6 +3890,31 @@ void LLInventoryAction::fileUploadLocation(const LLUUID& dest_id, const std::str
}
}
+bool LLInventoryAction::isFileUploadLocation(const LLUUID& dest_id, const std::string& action)
+{
+ if (action == "def_model")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT) == dest_id;
+ }
+ else if (action == "def_texture")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE) == dest_id;
+ }
+ else if (action == "def_sound")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_SOUND) == dest_id;
+ }
+ else if (action == "def_animation")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_ANIMATION) == dest_id;
+ }
+ else if (action == "def_pbr_material")
+ {
+ return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) == dest_id;
+ }
+ return false;
+}
+
void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index ae7bb8770d..77a2a18877 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -653,6 +653,7 @@ struct LLInventoryAction
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
static void removeItemFromDND(LLFolderView* root);
static void fileUploadLocation(const LLUUID& dest_id, const std::string& action);
+ static bool isFileUploadLocation(const LLUUID& dest_id, const std::string& action);
static void saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model);
diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
index 7212c4dedb..e129a1296a 100644
--- a/indra/newview/llinventorygallerymenu.cpp
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -110,6 +110,7 @@ LLContextMenu* LLInventoryGalleryContextMenu::createMenu()
registrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, uuids, gFloaterView->getParentFloater(mGallery)));
enable_registrar.add("Inventory.CanSetUploadLocation", boost::bind(&LLInventoryGalleryContextMenu::canSetUploadLocation, this, _2));
+ enable_registrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryGalleryContextMenu::isUploadLocationSelected, this, _2));
enable_registrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl*, const LLSD&)
{
@@ -489,6 +490,12 @@ void LLInventoryGalleryContextMenu::fileUploadLocation(const LLSD& userdata)
LLInventoryAction::fileUploadLocation(mUUIDs.front(), param);
}
+bool LLInventoryGalleryContextMenu::isUploadLocationSelected(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ return LLInventoryAction::isFileUploadLocation(mUUIDs.front(), param);
+}
+
bool LLInventoryGalleryContextMenu::canSetUploadLocation(const LLSD& userdata)
{
if (mUUIDs.size() != 1)
diff --git a/indra/newview/llinventorygallerymenu.h b/indra/newview/llinventorygallerymenu.h
index 7c3545432b..e90c7a19d2 100644
--- a/indra/newview/llinventorygallerymenu.h
+++ b/indra/newview/llinventorygallerymenu.h
@@ -47,6 +47,7 @@ protected:
void updateMenuItemsVisibility(LLContextMenu* menu);
void fileUploadLocation(const LLSD& userdata);
+ bool isUploadLocationSelected(const LLSD& userdata);
bool canSetUploadLocation(const LLSD& userdata);
static void onRename(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 590cbbec4e..a935ede186 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -187,6 +187,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryPanel::isUploadLocationSelected, this, _2));
mCommitCallbackRegistrar.add("Inventory.OpenNewFolderWindow", boost::bind(&LLInventoryPanel::openSingleViewInventory, this, LLUUID()));
}
@@ -1832,6 +1833,13 @@ void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
LLInventoryAction::fileUploadLocation(dest, param);
}
+bool LLInventoryPanel::isUploadLocationSelected(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID();
+ return LLInventoryAction::isFileUploadLocation(dest, param);
+}
+
void LLInventoryPanel::openSingleViewInventory(LLUUID folder_id)
{
LLPanelMainInventory::newFolderWindow(folder_id.isNull() ? LLFolderBridge::sSelf.get()->getUUID() : folder_id);
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 473283352f..50333709fc 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -225,6 +225,7 @@ public:
void doCreate(const LLSD& userdata);
bool beginIMSession();
void fileUploadLocation(const LLSD& userdata);
+ bool isUploadLocationSelected(const LLSD& userdata);
void openSingleViewInventory(LLUUID folder_id = LLUUID());
void purgeSelectedItems();
bool attachObject(const LLSD& userdata);
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index e31fbb188a..a99c9df0ff 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -196,7 +196,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
#ifndef LL_WINDOWS
const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename));
#else
- const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename)));
+ const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(ll_convert<std::wstring>(mFilename)));
#endif
LLSD new_last_modified = asctime(localtime(&temp_time));
diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp
index fab18f2d26..d6facad23d 100644
--- a/indra/newview/lllocalgltfmaterials.cpp
+++ b/indra/newview/lllocalgltfmaterials.cpp
@@ -134,7 +134,7 @@ bool LLLocalGLTFMaterial::updateSelf()
#ifndef LL_WINDOWS
const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename));
#else
- const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename)));
+ const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(ll_convert<std::wstring>(mFilename)));
#endif
LLSD new_last_modified = asctime(localtime(&temp_time));
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index aa03001389..51c38aba3a 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -293,7 +293,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
if (validate_as_uuid)
{
std::wstring ws(serialNumber, serial_size);
- std::string str = ll_convert_wide_to_string(ws);
+ std::string str = ll_convert<std::string>(ws);
if (!LLUUID::validate(str))
{
@@ -315,7 +315,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
continue;
}
}
- LL_INFOS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL;
+ LL_INFOS("AppInit") << " Serial Number : " << ll_convert_wide_to_string(std::wstring(vtProp.bstrVal, SysStringLen(vtProp.bstrVal))) << LL_ENDL;
unsigned int j = 0;
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 3e5d6d1171..cac72bb085 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -63,8 +63,9 @@
#include "tinygltf/tiny_gltf.h"
#include "lltinygltfhelper.h"
-#include <strstream>
+#include <boost/iostreams/device/array.hpp>
+#include <boost/iostreams/stream.hpp>
const std::string MATERIAL_BASE_COLOR_DEFAULT_NAME = "Base Color";
const std::string MATERIAL_NORMAL_DEFAULT_NAME = "Normal";
@@ -1246,7 +1247,7 @@ bool LLMaterialEditor::decodeAsset(const std::vector<char>& buffer)
{
LLSD asset;
- std::istrstream str(&buffer[0], buffer.size());
+ boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size());
if (LLSDSerialize::deserialize(asset, str, buffer.size()))
{
if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString()))
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 202008f7f9..c7b60b2fd5 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -347,6 +347,7 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this));
+ registar.add("Open.ShowSource", boost::bind(&LLMediaCtrl::onShowSource, this));
// stinson 05/05/2014 : use this as the parent of the context menu if the static menu
// container has yet to be created
@@ -364,8 +365,9 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
// hide/show debugging options
bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
+ menu->setItemVisible("debug_separator", media_plugin_debugging_enabled);
menu->setItemVisible("open_webinspector", media_plugin_debugging_enabled );
- menu->setItemVisible("debug_separator", media_plugin_debugging_enabled );
+ menu->setItemVisible("show_page_source", media_plugin_debugging_enabled);
menu->show(x, y);
LLMenuGL::showPopup(this, menu, x, y);
@@ -444,6 +446,12 @@ void LLMediaCtrl::onOpenWebInspector()
mMediaSource->getMediaPlugin()->showWebInspector( true );
}
+void LLMediaCtrl::onShowSource()
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ mMediaSource->getMediaPlugin()->showPageSource();
+}
+
////////////////////////////////////////////////////////////////////////////////
//
bool LLMediaCtrl::handleKeyHere( KEY key, MASK mask )
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 9f9564af46..a644ef3071 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -171,6 +171,7 @@ public:
// right click debugging item
void onOpenWebInspector();
+ void onShowSource();
LLUUID getTextureID() {return mMediaTextureID;}
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 9e8ed3bb43..8d5f94cdbb 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2310,6 +2310,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
}
if (request_skin)
{
+ LLMutexLock lock(mMutex);
mSkinRequests.push_back(UUIDBasedRequest(mesh_id));
}
}
@@ -2460,7 +2461,7 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
LLPointer<LLMeshSkinInfo> info = nullptr;
info = new LLMeshSkinInfo(mesh_id, skin);
- if (isAgentAvatarValid())
+ if (isAgentAvatarValid() && gAgentAvatarp->mInitFlags != 0)
{ // joint numbers are consistent inside LLVOAvatar and animations, but inconsistent inside meshes,
// generate a map of mesh joint numbers to LLVOAvatar joint numbers
LLSkinningUtil::initJointNums(info, gAgentAvatarp);
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index b1c8b5f36a..86071e38e1 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -645,7 +645,7 @@ void LLPanelPrimMediaControls::updateShape()
vert_it = vect_face.begin();
vert_end = vect_face.end();
- glm::mat4 mat;
+ glm::mat4 mat = glm::identity<glm::mat4>();
if (!is_hud)
{
mat = get_current_projection() * get_current_modelview();
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 3391b7adf7..c6fa64753c 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -211,6 +211,7 @@ void LLReflectionMapManager::update()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("reflection manager update");
llassert(!gCubeSnapshot); // assert a snapshot is not in progress
if (LLAppViewer::instance()->logoutRequestSent())
{
@@ -222,25 +223,21 @@ void LLReflectionMapManager::update()
resume();
}
- static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1);
- static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
- static LLCachedControl<U32> sReflectionProbeCount(gSavedSettings, "RenderReflectionProbeCount", 256U);
- static LLCachedControl<S32> sProbeDynamicAllocation(gSavedSettings, "RenderReflectionProbeDynamicAllocation", -1);
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
{
U32 probe_count_temp = mDynamicProbeCount;
- if (sProbeDynamicAllocation > -1)
+ if (mRenderReflectionProbeDynamicAllocation > -1)
{
- if (sLevel == 0)
+ if (mRenderReflectionProbeLevel == 0)
{
mDynamicProbeCount = 1;
}
- else if (sLevel == 1)
+ else if (mRenderReflectionProbeLevel == 1)
{
mDynamicProbeCount = (U32)mProbes.size();
}
- else if (sLevel == 2)
+ else if (mRenderReflectionProbeLevel == 2)
{
mDynamicProbeCount = llmax((U32)mProbes.size(), 128);
}
@@ -249,20 +246,20 @@ void LLReflectionMapManager::update()
mDynamicProbeCount = 256;
}
- if (sProbeDynamicAllocation > 1)
+ if (mRenderReflectionProbeDynamicAllocation > 1)
{
// Round mDynamicProbeCount to the nearest increment of 16
- mDynamicProbeCount = ((mDynamicProbeCount + sProbeDynamicAllocation / 2) / sProbeDynamicAllocation) * 16;
- mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, sReflectionProbeCount);
+ mDynamicProbeCount = ((mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation / 2) / mRenderReflectionProbeDynamicAllocation) * 16;
+ mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, mRenderReflectionProbeCount);
}
else
{
- mDynamicProbeCount = llclamp(mDynamicProbeCount + sProbeDynamicAllocation, 1, sReflectionProbeCount);
+ mDynamicProbeCount = llclamp(mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation, 1, mRenderReflectionProbeCount);
}
}
else
{
- mDynamicProbeCount = sReflectionProbeCount;
+ mDynamicProbeCount = mRenderReflectionProbeCount;
}
mDynamicProbeCount = llmin(mDynamicProbeCount, LL_MAX_REFLECTION_PROBE_COUNT);
@@ -328,7 +325,7 @@ void LLReflectionMapManager::update()
bool did_update = false;
- bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
+ bool realtime = mRenderReflectionProbeDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
LLReflectionMap* closestDynamic = nullptr;
@@ -457,7 +454,7 @@ void LLReflectionMapManager::update()
closestDynamic = probe;
}
- if (sLevel == 0)
+ if (mRenderReflectionProbeLevel == 0)
{
// only update default probe when coverage is set to none
llassert(probe == mDefaultProbe);
@@ -489,12 +486,12 @@ void LLReflectionMapManager::update()
static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f);
if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod)
{
- if (sLevel == 0)
+ if (mRenderReflectionProbeLevel == 0)
{ // when probes are disabled don't update the default probe more often than the prescribed update period
oldestProbe = nullptr;
}
}
- else if (sLevel > 0)
+ else if (mRenderReflectionProbeLevel > 0)
{ // when probes are enabled don't update the default probe less often than the prescribed update period
oldestProbe = mDefaultProbe;
}
@@ -520,6 +517,14 @@ void LLReflectionMapManager::update()
}
}
+void LLReflectionMapManager::refreshSettings()
+{
+ mRenderReflectionProbeDetail = gSavedSettings.getS32("RenderReflectionProbeDetail");
+ mRenderReflectionProbeLevel = gSavedSettings.getS32("RenderReflectionProbeLevel");
+ mRenderReflectionProbeCount = gSavedSettings.getU32("RenderReflectionProbeCount");
+ mRenderReflectionProbeDynamicAllocation = gSavedSettings.getS32("RenderReflectionProbeDynamicAllocation");
+}
+
LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group)
{
if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled)
@@ -756,6 +761,8 @@ void LLReflectionMapManager::doProbeUpdate()
// In effect this simulates single-bounce lighting.
void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("probe update");
// hacky hot-swap of camera specific render targets
gPipeline.mRT = &gPipeline.mAuxillaryRT;
@@ -782,7 +789,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
}
else
{
- llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none
+ llassert(mRenderReflectionProbeLevel > 0); // should never update a probe that's not the default probe if reflection coverage is none
probe->update(mRenderTarget.getWidth(), face);
}
@@ -991,11 +998,11 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
mTexture->bind(channel);
}
}
+
+ gIrradianceGenProgram.unbind();
}
mMipChain[0].flush();
-
- gIrradianceGenProgram.unbind();
}
}
@@ -1071,6 +1078,7 @@ void LLReflectionMapManager::updateUniforms()
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
+ LL_PROFILE_GPU_ZONE("rmmu - uniforms")
mReflectionMaps.resize(mReflectionProbeCount);
diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h
index 0719c28134..5daed7d1cf 100644
--- a/indra/newview/llreflectionmapmanager.h
+++ b/indra/newview/llreflectionmapmanager.h
@@ -110,6 +110,8 @@ public:
// maintain reflection probes
void update();
+ void refreshSettings();
+
// add a probe for the given spatial group
LLReflectionMap* addProbe(LLSpatialGroup* group = nullptr);
@@ -248,6 +250,12 @@ private:
U32 mDynamicProbeCount;
+ // cached settings from gSavedSettings
+ S32 mRenderReflectionProbeDetail = -1;
+ S32 mRenderReflectionProbeLevel = 3;
+ U32 mRenderReflectionProbeCount = 256U;
+ S32 mRenderReflectionProbeDynamicAllocation = -1;
+
// resolution of reflection probes
U32 mProbeResolution = 128;
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 9e567e3262..6238a1145c 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -71,10 +71,10 @@ LLSLURL::LLSLURL(const std::string& slurl)
{
LLURI slurl_uri;
// parse the slurl as a uri
- if (slurl.find(':') == std::string::npos)
+ if (slurl.find("://") == std::string::npos)
{
- // There may be no scheme ('secondlife:' etc.) passed in. In that case
- // we want to normalize the slurl by putting the appropriate scheme
+ // There may be no scheme ('secondlife://', 'https://' etc.) passed in. In that
+ // case we want to normalize the slurl by putting the appropriate scheme
// in front of the slurl. So, we grab the appropriate slurl base
// from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or
// https://<hostname>/region/ for Standalone grid (the word region, not the region name)
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index 532b245ced..06458a9f3c 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -200,8 +200,17 @@ void SpeakingIndicatorManager::cleanupSingleton()
void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
{
- switchSpeakerIndicators(mSwitchedIndicatorsOn, false);
- mSwitchedIndicatorsOn.clear();
+ if (LLVoiceChannel::isSuspended())
+ {
+ switchSpeakerIndicators(mSwitchedIndicatorsOn, false);
+ mSwitchedIndicatorsOn.clear();
+ }
+ else
+ {
+ // Multiple onParticipantsChanged can arrive at the same time
+ // from different sources, might want to filter by some factor.
+ onParticipantsChanged();
+ }
}
void SpeakingIndicatorManager::onParticipantsChanged()
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 2409b71f00..bf7c58a3cb 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -57,6 +57,7 @@
#include "lllocationhistory.h"
#include "llgltfmateriallist.h"
#include "llimageworker.h"
+#include "llregex.h"
#include "llloginflags.h"
#include "llmd5.h"
@@ -342,13 +343,11 @@ void pump_idle_startup_network(void)
{
// while there are message to process:
// process one then call display_startup()
- S32 num_messages = 0;
{
LockMessageChecker lmc(gMessageSystem);
while (lmc.checkAllMessages(gFrameCount, gServicePump))
{
display_startup();
- ++num_messages;
}
lmc.processAcks();
}
@@ -399,6 +398,7 @@ bool idle_startup()
LL_WARNS_ONCE() << "gViewerWindow is not initialized" << LL_ENDL;
return false; // No world yet
}
+ LL_PROFILE_ZONE_SCOPED;
const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
static LLTimer timeout;
@@ -2559,6 +2559,27 @@ void release_notes_coro(const std::string url)
LLWeb::loadURLInternal(url);
}
+void validate_release_notes_coro(const std::string url)
+{
+ LLVersionInfo& versionInfo(LLVersionInfo::instance());
+ const boost::regex version_regex(R"(\b\d+\.\d+\.\d+\.\d+\b)");
+
+ if (url.find(versionInfo.getVersion()) == std::string::npos // has no our build version
+ && ll_regex_search(url, version_regex)) // has any version
+ {
+ LL_INFOS() << "Received release notes url \"" << url << "\" wwith mismatching build, falling back to locally generated url" << LL_ENDL;
+ // Updater only provides notes for a most recent version, if it is not
+ // the current one, fall back to the hardcoded URL.
+ LLSD info(LLAppViewer::instance()->getViewerInfo());
+ std::string alt_url = info["VIEWER_RELEASE_NOTES_URL"].asString();
+ release_notes_coro(alt_url);
+ }
+ else
+ {
+ release_notes_coro(url);
+ }
+}
+
/**
* Check if user is running a new version of the viewer.
* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting.
@@ -2592,7 +2613,7 @@ void show_release_notes_if_required()
"showrelnotes",
[](const LLSD& url) {
LLCoros::instance().launch("releaseNotesCoro",
- boost::bind(&release_notes_coro, url.asString()));
+ boost::bind(&validate_release_notes_coro, url.asString()));
return false;
});
}
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index bb93e2e79e..2727127633 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -41,6 +41,7 @@
#include "llpanelpresetscamerapulldown.h"
#include "llpanelpresetspulldown.h"
#include "llpanelvolumepulldown.h"
+#include "llfloatermarketplace.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhints.h"
@@ -161,7 +162,8 @@ bool LLStatusBar::postBuild()
getChild<LLUICtrl>("buyL")->setCommitCallback(
boost::bind(&LLStatusBar::onClickBuyCurrency, this));
- getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURL, gSavedSettings.getString("MarketplaceURL"), LLStringUtil::null, LLStringUtil::null));
+ getChild<LLUICtrl>("goShop")->setCommitCallback(
+ boost::bind(&LLStatusBar::onClickShop, this));
mBoxBalance = getChild<LLTextBox>("balance");
mBoxBalance->setClickedCallback(&LLStatusBar::onClickRefreshBalance, this);
@@ -520,6 +522,15 @@ void LLStatusBar::onClickBuyCurrency()
LLFirstUse::receiveLindens(false);
}
+void LLStatusBar::onClickShop()
+{
+ LLFloaterReg::showInstanceOrBringToFront("marketplace");
+ if (LLFloaterMarketplace* marketplace = LLFloaterReg::getTypedInstance<LLFloaterMarketplace>("marketplace"))
+ {
+ marketplace->openMarketplace();
+ }
+}
+
void LLStatusBar::onMouseEnterPresetsCamera()
{
LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index a8fc621ff8..eb4ca8e894 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -101,6 +101,7 @@ public:
private:
void onClickBuyCurrency();
+ void onClickShop();
void onVolumeChanged(const LLSD& newvalue);
void onVoiceChanged(const LLSD& newvalue);
void onObscureBalanceChanged(const LLSD& newvalue);
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2027e958d5..5507ef517a 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -186,6 +186,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mOnUpdateImageStatsCallback(NULL),
mBakeTextureEnabled(false),
mLocalTextureEnabled(false),
+ mNoCopyTextureSelected(false),
mInventoryPickType(pick_type)
{
setTentative(tentative);
@@ -263,6 +264,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
if (set_selection)
{
+ // This is going to cause a callback
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
}
}
@@ -597,7 +599,6 @@ bool LLFloaterTexturePicker::postBuild()
refreshInventoryFilter();
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
- mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
// Disable auto selecting first filtered item because it takes away
@@ -616,8 +617,25 @@ bool LLFloaterTexturePicker::postBuild()
if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
{
- mInventoryPanel->setSelection(findItemID(mImageAssetID, false), TAKE_FOCUS_NO);
+ LLViewerInventoryItem* itemp = findInvItem(mImageAssetID, false);
+ LLUUID item_id;
+ if (itemp)
+ {
+ item_id = itemp->getUUID();
+ }
+
+ mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
+
+ if (item_id.notNull() && itemp)
+ {
+ if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ mNoCopyTextureSelected = true;
+ }
+ }
}
+ // Don't call before setSelection, setSelection will mark view as dirty
+ mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
}
childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
@@ -809,12 +827,12 @@ void LLFloaterTexturePicker::draw()
}
}
-const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library)
+LLViewerInventoryItem* LLFloaterTexturePicker::findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
{
if (asset_id.isNull())
{
// null asset id means, no material or texture assigned
- return LLUUID::null;
+ return nullptr;
}
LLUUID loockup_id = asset_id;
@@ -854,30 +872,41 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool co
// search for copyable version first
for (S32 i = 0; i < items.size(); i++)
{
- LLInventoryItem* itemp = items[i];
+ LLViewerInventoryItem* itemp = items[i];
LLPermissions item_permissions = itemp->getPermissions();
if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
{
- if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID()))
+ if (!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(), gInventory.getLibraryRootFolderID()))
{
- return itemp->getUUID();
+ return itemp;
}
}
}
// otherwise just return first instance, unless copyable requested
if (copyable_only)
{
- return LLUUID::null;
+ return nullptr;
}
else
{
- if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID()))
+ if (!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(), gInventory.getLibraryRootFolderID()))
{
- return items[0]->getUUID();
+ return items[0];
}
}
}
+ return nullptr;
+}
+
+const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
+{
+ LLViewerInventoryItem* itemp = findInvItem(asset_id, copyable_only, ignore_library);
+ if (itemp)
+ {
+ return itemp->getUUID();
+ }
+
return LLUUID::null;
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 79957431b7..467b8d1091 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -340,7 +340,7 @@ public:
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
bool updateImageStats(); // true if within limits
const LLUUID& getAssetID() { return mImageAssetID; }
- const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false);
+ const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
void setCanApplyImmediately(bool b);
void setActive(bool active);
@@ -397,6 +397,7 @@ protected:
void refreshLocalList();
void refreshInventoryFilter();
void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true);
+ LLViewerInventoryItem* findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
LLPointer<LLViewerTexture> mTexturep;
LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index cc187a1f98..93b5806acf 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -49,6 +49,7 @@
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
+#include "llviewerthrottle.h"
#include "llviewerassetstats.h"
#include "llworld.h"
#include "llsdparam.h"
@@ -2434,7 +2435,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded, bool qa_mod
mOriginFetchSource(LLTextureFetch::FROM_ALL),
mTextureInfoMainThread(false)
{
- mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();
mTextureInfo.setLogging(true);
LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp());
@@ -2953,11 +2954,10 @@ void LLTextureFetch::commonUpdate()
size_t LLTextureFetch::update(F32 max_time_ms)
{
LL_PROFILE_ZONE_SCOPED;
- static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 3000.0);
{
mNetworkQueueMutex.lock(); // +Mfnq
- mMaxBandwidth = band_width();
+ mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, mHTTPTextureBits);
mHTTPTextureBits = (U32Bits)0;
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 8560a01c4b..8cbede8303 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -49,6 +49,7 @@
#include "llviewerobjectlist.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
+#include "llviewerthrottle.h"
#include "llviewerwindow.h"
#include "llwindow.h"
#include "llvovolume.h"
@@ -633,7 +634,7 @@ void LLGLTexMemBar::draw()
LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right);
F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth());
- F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS"));
+ F32Kilobits max_bandwidth(LLViewerThrottle::getMaxBandwidthKbps());
color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
color[VALPHA] = text_color[VALPHA];
text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value());
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 511293a808..af6c78d8e5 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -157,9 +157,9 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 &center, const LLVecto
// update pixel meter ratio using default fov, not modified one
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
// update screen pixel area
+ mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
return true;
- mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
}
const LLMatrix4 &LLViewerCamera::getProjection() const
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 598ad89907..d39805f4c7 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -447,6 +447,7 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
{
+ gPipeline.mReflectionMapManager.refreshSettings();
if (gPipeline.isInit())
{
LLPipeline::refreshCachedSettings();
@@ -459,6 +460,12 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
return true;
}
+static bool handleReflectionProbeCountChanged(const LLSD& newvalue)
+{
+ gPipeline.mReflectionMapManager.refreshSettings();
+ return true;
+}
+
#if LL_DARWIN
static bool handleAppleUseMultGLChanged(const LLSD& newvalue)
{
@@ -836,6 +843,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeCount", handleReflectionProbeCountChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
#if LL_DARWIN
setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged);
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 71830e0948..7a93536c00 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -410,6 +410,7 @@ static void update_tp_display(bool minimized)
void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Render");
+ LL_PROFILE_GPU_ZONE("Render");
LLPerfStats::RecordSceneTime T (LLPerfStats::StatType_t::RENDER_DISPLAY); // render time capture - This is the main stat for overall rendering.
@@ -714,6 +715,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
if (gPipeline.RenderMirrors && !gSnapshot)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update hero probes");
+ LL_PROFILE_GPU_ZONE("hero manager")
gPipeline.mHeroProbeManager.update();
gPipeline.mHeroProbeManager.renderProbes();
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 4b3af6d7e8..3b35ca8db1 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -21,6 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -98,6 +99,7 @@
#include "llfloaterlinkreplace.h"
#include "llfloaterloadprefpreset.h"
#include "llfloatermap.h"
+#include "llfloatermarketplace.h"
#include "llfloatermarketplacelistings.h"
#include "llfloatermediasettings.h"
#include "llfloatermemleak.h"
@@ -419,6 +421,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);
+ LLFloaterReg::add("marketplace", "floater_marketplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplace>);
LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>);
LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>);
LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 9d45ea24b9..8edb21956f 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -144,7 +144,7 @@ BOOL CALLBACK di8_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVO
// Capable of detecting devices like Oculus Rift
if (device_instance_ptr)
{
- std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName));
+ std::string product_name = ll_convert<std::string>(std::wstring(device_instance_ptr->tszProductName));
LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID();
@@ -211,7 +211,7 @@ BOOL CALLBACK di8_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVO
// This is GUID2 so teoretically it can be memcpy copied into LLUUID
void guid_from_string(GUID &guid, const std::string &input)
{
- CLSIDFromString(utf8str_to_utf16str(input).c_str(), &guid);
+ CLSIDFromString(ll_convert<std::wstring>(input).c_str(), &guid);
}
std::string string_from_guid(const GUID &guid)
@@ -221,7 +221,7 @@ std::string string_from_guid(const GUID &guid)
// use guidString...
- std::string res = utf16str_to_utf8str(llutf16string(guidString));
+ std::string res = ll_convert<std::string>(std::wstring(guidString));
// ensure memory is freed
::CoTaskMemFree(guidString);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 82a52e63f6..89861d74bc 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1259,35 +1259,46 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
{
LLAppViewer::instance()->postToMainCoro([=]()
{
- LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
- if (media_instance)
+ std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
+ std::string cookie_name = "";
+ std::string cookie_value = "";
+ std::string cookie_path = "";
+ bool httponly = true;
+ bool secure = true;
+
+ LLViewerMedia* inst = getInstance();
+ if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))
{
- LLViewerMedia* inst = getInstance();
- std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart);
- std::string cookie_name = "";
- std::string cookie_value = "";
- std::string cookie_path = "";
- bool httponly = true;
- bool secure = true;
- if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
- media_instance->getMediaPlugin())
+ // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
+ // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
+ // For now, we use the URL for the OpenID POST request since it will have the same authority
+ // as the domain field.
+ // (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
+ // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further
+ // down.
+ std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
+
+ // list of floater names and webbrowser therein to set the cookie that arrived via login into
+ struct MediaCookieInstance {
+ std::string floater_name;
+ std::string browser_name;
+ };
+ struct MediaCookieInstance media_cookie_instances[] = {
+ {"search", "search_contents" },
+ {"marketplace", "marketplace_contents" },
+ {"destinations", "destination_guide_contents" },
+ };
+ for (MediaCookieInstance mci : media_cookie_instances)
{
- // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
- // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
- // For now, we use the URL for the OpenID POST request since it will have the same authority
- // as the domain field.
- // (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
- // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further
- // down.
- std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority));
-
- media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
- cookie_path, httponly, secure);
-
- // Now that we have parsed the raw cookie, we must store it so that each new media instance
- // can also get a copy and faciliate logging into internal SL sites.
- media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
- cookie_host, cookie_path, httponly, secure);
+ LLMediaCtrl* media_instance = LLFloaterReg::getInstance(mci.floater_name)->getChild<LLMediaCtrl>(mci.browser_name);
+ if (media_instance && media_instance->getMediaPlugin())
+ {
+ media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host,
+ cookie_path, httponly, secure);
+
+ media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value,
+ cookie_host, cookie_path, httponly, secure);
+ }
}
}
});
@@ -3500,6 +3511,46 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
////////////////////////////////////////////////////////////////////////////////
// virtual
void
+LLViewerMediaImpl::undo()
+{
+ if (mMediaSource)
+ mMediaSource->undo();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canUndo() const
+{
+ if (mMediaSource)
+ return mMediaSource->canUndo();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::redo()
+{
+ if (mMediaSource)
+ mMediaSource->redo();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canRedo() const
+{
+ if (mMediaSource)
+ return mMediaSource->canRedo();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
LLViewerMediaImpl::cut()
{
if (mMediaSource)
@@ -3557,6 +3608,46 @@ LLViewerMediaImpl::canPaste() const
return false;
}
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::doDelete()
+{
+ if (mMediaSource)
+ mMediaSource->doDelete();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canDoDelete() const
+{
+ if (mMediaSource)
+ return mMediaSource->canDoDelete();
+ else
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+void
+LLViewerMediaImpl::selectAll()
+{
+ if (mMediaSource)
+ mMediaSource->selectAll();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+bool
+LLViewerMediaImpl::canSelectAll() const
+{
+ if (mMediaSource)
+ return mMediaSource->canSelectAll();
+ else
+ return FALSE;
+}
+
void LLViewerMediaImpl::setUpdated(bool updated)
{
mIsUpdated = updated ;
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 5753615a43..c17cf59815 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -341,6 +341,12 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent);
// LLEditMenuHandler overrides
+ /*virtual*/ void undo();
+ /*virtual*/ bool canUndo() const;
+
+ /*virtual*/ void redo();
+ /*virtual*/ bool canRedo() const;
+
/*virtual*/ void cut();
/*virtual*/ bool canCut() const;
@@ -350,6 +356,12 @@ public:
/*virtual*/ void paste();
/*virtual*/ bool canPaste() const;
+ /*virtual*/ void doDelete();
+ /*virtual*/ bool canDoDelete() const;
+
+ /*virtual*/ void selectAll();
+ /*virtual*/ bool canSelectAll() const;
+
void addObject(LLVOVolume* obj) ;
void removeObject(LLVOVolume* obj) ;
const std::list< LLVOVolume* >* getObjectList() const ;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index d66da27bc7..f7688b762f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -4354,13 +4354,6 @@ void set_god_level(U8 god_level)
// changing god-level can affect which menus we see
show_debug_menus();
-
- // changing god-level can invalidate search results
- LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search"));
- if (search)
- {
- search->godLevelChanged(god_level);
- }
}
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -6517,7 +6510,7 @@ void handle_look_at_selection(const LLSD& param)
}
}
-void handle_zoom_to_object(const LLUUID& object_id)
+bool handle_zoom_to_object(const LLUUID& object_id)
{
const F32 PADDING_FACTOR = 2.f;
@@ -6535,12 +6528,14 @@ void handle_zoom_to_object(const LLUUID& object_id)
obj_to_cam.normVec();
- LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+ LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
- gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
object_center_global,
object_id );
+ return true;
}
+ return false;
}
class LLAvatarInviteToGroup : public view_listener_t
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 68c3dbc126..522c7e8109 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -73,7 +73,7 @@ void handle_buy();
void handle_take(bool take_separate = false);
void handle_take_copy();
void handle_look_at_selection(const LLSD& param);
-void handle_zoom_to_object(const LLUUID& object_id);
+bool handle_zoom_to_object(const LLUUID& object_id);
void handle_object_return();
void handle_object_delete();
void handle_object_edit();
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 3695478061..801ff3c212 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -912,7 +912,23 @@ class LLFileUploadModel : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLFloaterModelPreview::showModelPreview();
+ if (LLConvexDecomposition::isFunctional())
+ {
+ LLFloaterModelPreview::showModelPreview();
+ }
+ else
+ {
+ if (gGLManager.mIsApple)
+ {
+ LLNotificationsUtil::add("ModelUploaderMissingPhysicsApple");
+ }
+ else
+ {
+ // TPV?
+ LLNotificationsUtil::add("ModelUploaderMissingPhysics");
+ LLFloaterModelPreview::showModelPreview();
+ }
+ }
return true;
}
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 7d39cc6059..16b7ac33b8 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3364,6 +3364,14 @@ void send_agent_update(bool force_send, bool send_reliable)
msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis());
static F32 last_draw_disatance_step = 1024;
+ F32 memory_limited_draw_distance = gAgentCamera.mDrawDistance;
+
+ if (LLViewerTexture::isSystemMemoryCritical())
+ {
+ // If we are low on memory, reduce requested draw distance
+ memory_limited_draw_distance = llmax(gAgentCamera.mDrawDistance / LLViewerTexture::getSystemMemoryBudgetFactor(), gAgentCamera.mDrawDistance / 2.f);
+ }
+
if (tp_state == LLAgent::TELEPORT_ARRIVING || LLStartUp::getStartupState() < STATE_MISC)
{
// Inform interest list, prioritize closer area.
@@ -3372,25 +3380,25 @@ void send_agent_update(bool force_send, bool send_reliable)
// closer ones.
// Todo: revise and remove once server gets distance sorting.
last_draw_disatance_step = llmax((F32)(gAgentCamera.mDrawDistance / 2.f), 50.f);
+ last_draw_disatance_step = llmin(last_draw_disatance_step, memory_limited_draw_distance);
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
}
- else if (last_draw_disatance_step < gAgentCamera.mDrawDistance)
+ else if (last_draw_disatance_step < memory_limited_draw_distance)
{
static LLFrameTimer last_step_time;
if (last_step_time.getElapsedTimeF32() > 1.f)
{
// gradually increase draw distance
- // Idealy this should be not per second, but based on how loaded
- // mesh thread is, but hopefully this is temporary.
last_step_time.reset();
- F32 step = gAgentCamera.mDrawDistance * 0.1f;
- last_draw_disatance_step = llmin(last_draw_disatance_step + step, gAgentCamera.mDrawDistance);
+ F32 step = memory_limited_draw_distance * 0.1f;
+ last_draw_disatance_step = llmin(last_draw_disatance_step + step, memory_limited_draw_distance);
}
msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);
}
else
{
- msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance);
+ last_draw_disatance_step = memory_limited_draw_distance;
+ msg->addF32Fast(_PREHASH_Far, memory_limited_draw_distance);
}
msg->addU32Fast(_PREHASH_ControlFlags, control_flags);
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 16ddc2f89c..f11fa09ce9 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -450,7 +450,7 @@ std::string LLGridManager::getGridLabel(const std::string& grid)
{
std::string grid_label;
std::string grid_name = getGrid(grid);
- if (!grid.empty())
+ if (!grid_name.empty())
{
grid_label = mGridList[grid_name][GRID_LABEL_VALUE].asString();
}
@@ -466,7 +466,7 @@ std::string LLGridManager::getGridId(const std::string& grid)
{
std::string grid_id;
std::string grid_name = getGrid(grid);
- if (!grid.empty())
+ if (!grid_name.empty())
{
grid_id = mGridList[grid_name][GRID_ID_VALUE].asString();
}
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index a0a9906724..0c912e8dbc 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -196,6 +196,10 @@ LLGLSLShader gDeferredCoFProgram;
LLGLSLShader gDeferredDoFCombineProgram;
LLGLSLShader gDeferredPostTonemapProgram;
LLGLSLShader gNoPostTonemapProgram;
+LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapGammaCorrectProgram;
+LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
LLGLSLShader gDeferredPostGammaCorrectProgram;
LLGLSLShader gLegacyPostGammaCorrectProgram;
LLGLSLShader gExposureProgram;
@@ -206,6 +210,7 @@ LLGLSLShader gSMAAEdgeDetectProgram[4];
LLGLSLShader gSMAABlendWeightsProgram[4];
LLGLSLShader gSMAANeighborhoodBlendProgram[4];
LLGLSLShader gCASProgram;
+LLGLSLShader gCASLegacyGammaProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gDeferredPostNoDoFNoiseProgram;
LLGLSLShader gDeferredWLSkyProgram;
@@ -443,6 +448,11 @@ void LLViewerShaderMgr::finalizeShaderList()
mShaderList.push_back(&gHUDPBRAlphaProgram);
mShaderList.push_back(&gDeferredPostTonemapProgram);
mShaderList.push_back(&gNoPostTonemapProgram);
+ mShaderList.push_back(&gDeferredPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gDeferredPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gCASLegacyGammaProgram);
mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma
mShaderList.push_back(&gLegacyPostGammaCorrectProgram);
mShaderList.push_back(&gDeferredDiffuseProgram);
@@ -545,7 +555,11 @@ void LLViewerShaderMgr::setShaders()
gSavedSettings.setString("RenderShaderCacheVersion", current_cache_version.asString());
}
- initShaderCache(shader_cache_enabled, old_cache_version, current_cache_version);
+ initShaderCache(
+ shader_cache_enabled,
+ old_cache_version,
+ current_cache_version,
+ LLAppViewer::instance()->isSecondInstance());
}
static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16);
@@ -703,7 +717,10 @@ void LLViewerShaderMgr::setShaders()
loaded = loaded && loadShadersDeferred();
llassert(loaded);
- persistShaderCacheMetadata();
+ if (!LLAppViewer::instance()->isSecondInstance())
+ {
+ persistShaderCacheMetadata();
+ }
if (gViewerWindow)
{
@@ -1109,6 +1126,11 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gLegacyPostGammaCorrectProgram.unload();
gDeferredPostTonemapProgram.unload();
gNoPostTonemapProgram.unload();
+ gDeferredPostTonemapGammaCorrectProgram.unload();
+ gNoPostTonemapGammaCorrectProgram.unload();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.unload();
+ gNoPostTonemapLegacyGammaCorrectProgram.unload();
+
for (auto i = 0; i < 4; ++i)
{
gFXAAProgram[i].unload();
@@ -1117,6 +1139,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gSMAANeighborhoodBlendProgram[i].unload();
}
gCASProgram.unload();
+ gCASLegacyGammaProgram.unload();
gEnvironmentMapProgram.unload();
gDeferredWLSkyProgram.unload();
gDeferredWLCloudProgram.unload();
@@ -2479,6 +2502,74 @@ bool LLViewerShaderMgr::loadShadersDeferred()
llassert(success);
}
+ if (success)
+ {
+ gDeferredPostTonemapGammaCorrectProgram.mName = "Deferred Tonemap Gamma Post Process";
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.clear();
+ gDeferredPostTonemapGammaCorrectProgram.clearPermutations();
+ gDeferredPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gDeferredPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostTonemapGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gNoPostTonemapGammaCorrectProgram.mName = "No Post Tonemap Gamma Post Process";
+ gNoPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gNoPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
+ gNoPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.clear();
+ gNoPostTonemapGammaCorrectProgram.clearPermutations();
+ gNoPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gNoPostTonemapGammaCorrectProgram.addPermutation("NO_POST", "1");
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gNoPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gNoPostTonemapGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mName = "Deferred Tonemap Legacy Gamma Post Process";
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gDeferredPostTonemapProgram.mFeatures.isDeferred = true;
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.clearPermutations();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostTonemapLegacyGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gNoPostTonemapLegacyGammaCorrectProgram.mName = "No Post Tonemap Legacy Gamma Post Process";
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.isDeferred = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
+ gNoPostTonemapLegacyGammaCorrectProgram.clearPermutations();
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("NO_POST", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gNoPostTonemapLegacyGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
if (success && gGLManager.mGLVersion > 3.9f)
{
std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"},
@@ -2662,6 +2753,27 @@ bool LLViewerShaderMgr::loadShadersDeferred()
}
}
+ if (success && gGLManager.mGLVersion > 4.05f)
+ {
+ gCASLegacyGammaProgram.mName = "Contrast Adaptive Sharpening Legacy Gamma Shader";
+ gCASLegacyGammaProgram.mFeatures.hasSrgb = true;
+ gCASLegacyGammaProgram.mShaderFiles.clear();
+ gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER));
+ gCASLegacyGammaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ gCASLegacyGammaProgram.clearPermutations();
+ gCASLegacyGammaProgram.addPermutation("GAMMA_CORRECT", "1");
+ gCASLegacyGammaProgram.addPermutation("LEGACY_GAMMA", "1");
+ success = gCASLegacyGammaProgram.createShader();
+ // llassert(success);
+ if (!success)
+ {
+ LL_WARNS() << "Failed to create shader '" << gCASProgram.mName << "', disabling!" << LL_ENDL;
+ // continue as if this shader never happened
+ success = true;
+ }
+ }
+
if (success)
{
gDeferredPostProgram.mName = "Deferred Post Shader";
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 7ad2da9464..46da30017d 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -250,12 +250,17 @@ extern LLGLSLShader gSMAAEdgeDetectProgram[4];
extern LLGLSLShader gSMAABlendWeightsProgram[4];
extern LLGLSLShader gSMAANeighborhoodBlendProgram[4];
extern LLGLSLShader gCASProgram;
+extern LLGLSLShader gCASLegacyGammaProgram;
extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredPostNoDoFNoiseProgram;
extern LLGLSLShader gDeferredPostGammaCorrectProgram;
extern LLGLSLShader gLegacyPostGammaCorrectProgram;
extern LLGLSLShader gDeferredPostTonemapProgram;
extern LLGLSLShader gNoPostTonemapProgram;
+extern LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
+extern LLGLSLShader gNoPostTonemapGammaCorrectProgram;
+extern LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
+extern LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
extern LLGLSLShader gExposureProgram;
extern LLGLSLShader gExposureProgramNoFade;
extern LLGLSLShader gLuminanceProgram;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 5ba0a86e68..3142c9950b 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -524,12 +524,19 @@ void LLViewerTexture::updateClass()
bool is_low = is_sys_low || over_pct > 0.f;
static bool was_low = false;
- static bool was_sys_low = false;
if (is_low && !was_low)
{
- // slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)
- sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
+ if (is_sys_low)
+ {
+ // Not having system memory is more serious, so discard harder
+ sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f * getSystemMemoryBudgetFactor());
+ }
+ else
+ {
+ // Slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)
+ sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f);
+ }
if (is_sys_low || over_pct > 2.f)
{ // if we're low on system memory, emergency purge off screen textures to avoid a death spiral
@@ -542,7 +549,6 @@ void LLViewerTexture::updateClass()
}
was_low = is_low;
- was_sys_low = is_sys_low;
if (is_low)
{
@@ -561,8 +567,13 @@ void LLViewerTexture::updateClass()
sEvaluationTimer.reset();
// lower discard bias over time when at least 10% of budget is free
- const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
- if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD)
+ constexpr F32 FREE_PERCENTAGE_TRESHOLD = -0.1f;
+ constexpr U32 FREE_SYS_MEM_TRESHOLD = 100;
+ static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
+ const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory() + FREE_SYS_MEM_TRESHOLD);
+ if (sDesiredDiscardBias > 1.f
+ && over_pct < FREE_PERCENTAGE_TRESHOLD
+ && getFreeSystemMemory() > MIN_FREE_MAIN_MEMORY)
{
static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f);
@@ -629,24 +640,54 @@ void LLViewerTexture::updateClass()
}
//static
-bool LLViewerTexture::isSystemMemoryLow()
+U32Megabytes LLViewerTexture::getFreeSystemMemory()
{
static LLFrameTimer timer;
static U32Megabytes physical_res = U32Megabytes(U32_MAX);
- static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
- const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
-
if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second.
{
- return physical_res < MIN_FREE_MAIN_MEMORY;
+ return physical_res;
}
timer.reset();
LLMemory::updateMemoryInfo();
physical_res = LLMemory::getAvailableMemKB();
- return physical_res < MIN_FREE_MAIN_MEMORY;
+ return physical_res;
+}
+
+S32Megabytes get_render_free_main_memory_treshold()
+{
+ static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512);
+ const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory);
+ return MIN_FREE_MAIN_MEMORY;
+}
+
+//static
+bool LLViewerTexture::isSystemMemoryLow()
+{
+ return getFreeSystemMemory() < get_render_free_main_memory_treshold();
+}
+
+//static
+bool LLViewerTexture::isSystemMemoryCritical()
+{
+ return getFreeSystemMemory() < get_render_free_main_memory_treshold() / 2;
+}
+
+F32 LLViewerTexture::getSystemMemoryBudgetFactor()
+{
+ const S32Megabytes MIN_FREE_MAIN_MEMORY(get_render_free_main_memory_treshold() / 2);
+ S32 free_budget = (S32Megabytes)getFreeSystemMemory() - MIN_FREE_MAIN_MEMORY;
+ if (free_budget < 0)
+ {
+ // Leave some padding, otherwise we will crash out of memory before hitting factor 2.
+ const S32Megabytes PAD_BUFFER(32);
+ // Result should range from 1 at 0 free budget to 2 at -224 free budget, 2.14 at -256MB
+ return 1.f - free_budget / (MIN_FREE_MAIN_MEMORY - PAD_BUFFER);
+ }
+ return 1.f;
}
//end of static functions
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index f9311d85cb..2937651995 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -115,6 +115,8 @@ public:
static void initClass();
static void updateClass();
static bool isSystemMemoryLow();
+ static bool isSystemMemoryCritical();
+ static F32 getSystemMemoryBudgetFactor();
LLViewerTexture(bool usemipmaps = true);
LLViewerTexture(const LLUUID& id, bool usemipmaps) ;
@@ -189,6 +191,8 @@ private:
friend class LLBumpImageList;
friend class LLUIImageList;
+ static U32Megabytes getFreeSystemMemory();
+
protected:
friend class LLViewerTextureList;
LLUUID mID;
diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp
index 8d935e4243..3ccfbea6e2 100644
--- a/indra/newview/llviewerthrottle.cpp
+++ b/indra/newview/llviewerthrottle.cpp
@@ -225,7 +225,7 @@ void LLViewerThrottle::setMaxBandwidth(F32 kbits_per_second, bool from_event)
void LLViewerThrottle::load()
{
- mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024;
+ mMaxBandwidth = getMaxBandwidthKbps() * 1024;
resetDynamicThrottle();
mCurrent.dump();
}
@@ -242,6 +242,15 @@ void LLViewerThrottle::sendToSim() const
mCurrent.sendToSim();
}
+F32 LLViewerThrottle::getMaxBandwidthKbps()
+{
+ constexpr F32 MIN_BANDWIDTH = 100.0f; // 100 Kbps
+ constexpr F32 MAX_BANDWIDTH = 10000.0f; // 10 Mbps
+
+ static LLCachedControl<F32> bandwidth(gSavedSettings, "ThrottleBandwidthKBPS", 3000.0);
+ return llclamp(bandwidth(), MIN_BANDWIDTH, MAX_BANDWIDTH);
+}
+
LLViewerThrottleGroup LLViewerThrottle::getThrottleGroup(const F32 bandwidth_kbps)
{
diff --git a/indra/newview/llviewerthrottle.h b/indra/newview/llviewerthrottle.h
index 9973c88549..ef898a97d7 100644
--- a/indra/newview/llviewerthrottle.h
+++ b/indra/newview/llviewerthrottle.h
@@ -64,6 +64,7 @@ public:
void save() const;
void sendToSim() const;
+ static F32 getMaxBandwidthKbps();
F32 getMaxBandwidth()const { return mMaxBandwidth; }
F32 getCurrentBandwidth() const { return mCurrentBandwidth; }
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b0408b73ad..8abced7e8f 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -261,9 +261,6 @@ static const F32 MIN_DISPLAY_SCALE = 0.75f;
static const char KEY_MOUSELOOK = 'M';
-static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
-static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
-
LLTrace::SampleStatHandle<> LLViewerWindow::sMouseVelocityStat("Mouse Velocity");
@@ -784,8 +781,16 @@ public:
addText(xpos, ypos, "Projection Matrix");
ypos += y_inc;
+#if LL_DARWIN
+// For sprintf deprecation
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
// View last column is always <0,0,0,1>
MATRIX_ROW_F32_TO_STR(gGLModelView, 12,camera_lines[3]); addText(xpos, ypos, std::string(camera_lines[3])); ypos += y_inc;
+#if LL_DARWIN
+#pragma clang diagnostic pop
+#endif
MATRIX_ROW_N32_TO_STR(gGLModelView, 8,camera_lines[2]); addText(xpos, ypos, std::string(camera_lines[2])); ypos += y_inc;
MATRIX_ROW_N32_TO_STR(gGLModelView, 4,camera_lines[1]); addText(xpos, ypos, std::string(camera_lines[1])); ypos += y_inc; mBackRectCamera2.mTop = ypos + 2;
MATRIX_ROW_N32_TO_STR(gGLModelView, 0,camera_lines[0]); addText(xpos, ypos, std::string(camera_lines[0])); ypos += y_inc;
@@ -2034,6 +2039,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
std::string LLViewerWindow::getLastSnapshotDir()
{
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
return sSnapshotDir;
}
@@ -2309,6 +2315,18 @@ void LLViewerWindow::initWorldUI()
url = LLWeb::expandURLSubstitutions(url, LLSD());
avatar_welcome_pack->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
+ LLMediaCtrl* search = LLFloaterReg::getInstance("search")->findChild<LLMediaCtrl>("search_contents");
+ if (search)
+ {
+ search->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ }
+ LLMediaCtrl* marketplace = LLFloaterReg::getInstance("marketplace")->getChild<LLMediaCtrl>("marketplace_contents");
+ if (marketplace)
+ {
+ marketplace->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("MarketplaceURL");
+ marketplace->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
+ }
}
}
@@ -4732,6 +4750,7 @@ void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke
// Get a base file location if needed.
if (force_picker || !isSnapshotLocSet())
{
+ static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
std::string proposed_name(sSnapshotBaseName);
// getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
@@ -4786,7 +4805,7 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
// Check if there is enough free space to save snapshot
#ifdef LL_WINDOWS
- boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
+ boost::filesystem::path b_path(ll_convert<std::wstring>(lastSnapshotDir));
#else
boost::filesystem::path b_path(lastSnapshotDir);
#endif
@@ -4830,6 +4849,9 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
// Shouldn't there be a return here?
}
+ static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
+
// Look for an unused file name
auto is_snapshot_name_loc_set = isSnapshotLocSet();
std::string filepath;
@@ -4937,8 +4959,8 @@ void LLViewerWindow::playSnapshotAnimAndSound()
bool LLViewerWindow::isSnapshotLocSet() const
{
- std::string snapshot_dir = sSnapshotDir;
- return !snapshot_dir.empty();
+ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
+ return !sSnapshotDir().empty();
}
void LLViewerWindow::resetSnapshotLoc() const
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 903d6a035f..c6a7a59034 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -4765,14 +4765,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)
}
bool visible = isVisible();
- bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing
- bool is_attachment = false;
-
- if (is_control_avatar)
- {
- LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this);
- is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects
- }
// For fading out the names above heads, only let the timer
// run if we're visible.
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 501828eee8..52a6afc2d0 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -486,14 +486,21 @@ void LLVOCacheEntry::updateDebugSettings()
//min radius: all objects within this radius remain loaded in memory
static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");
static const F32 MIN_RADIUS = 1.0f;
- const F32 draw_radius = gAgentCamera.mDrawDistance;
+
+ F32 draw_radius = gAgentCamera.mDrawDistance;
+ if (LLViewerTexture::isSystemMemoryCritical())
+ {
+ // Factor is intended to go from 1.0 to 2.0
+ // For safety cap reduction at 50%, we don't want to go below half of draw distance
+ draw_radius = llmax(draw_radius / LLViewerTexture::getSystemMemoryBudgetFactor(), draw_radius / 2.f);
+ }
const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance]
sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);
// a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold
static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction");
const F32 min_radius_plus_one = sNearRadius + 1.f;
- const F32 max_radius = rear_max_radius_frac * gAgentCamera.mDrawDistance;
+ const F32 max_radius = rear_max_radius_frac * draw_radius;
const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance]
sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor);
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index b3ac28eb7a..fbe896ac27 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -357,6 +357,8 @@ void LLVoiceChannel::suspend()
{
sSuspendedVoiceChannel = sCurrentVoiceChannel;
sSuspended = true;
+
+ sCurrentVoiceChannelChangedSignal(sSuspendedVoiceChannel->mSessionID);
}
}
@@ -365,6 +367,7 @@ void LLVoiceChannel::resume()
{
if (sSuspended)
{
+ sSuspended = false; // needs to be before activate() so that observers will be able to read state
if (LLVoiceClient::getInstance()->voiceEnabled())
{
if (sSuspendedVoiceChannel)
@@ -382,7 +385,6 @@ void LLVoiceChannel::resume()
LLVoiceChannelProximal::getInstance()->activate();
}
}
- sSuspended = false;
}
}
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 4d7bf551e1..bf119638d3 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -103,6 +103,7 @@ public:
static void suspend();
static void resume();
+ static bool isSuspended() { return sSuspended; }
protected:
virtual void setState(EState state);
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 3edd2b473c..71a9e71a9f 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -292,7 +292,14 @@ void LLVoiceClient::setHidden(bool hidden)
void LLVoiceClient::terminate()
{
- if (mSpatialVoiceModule) mSpatialVoiceModule->terminate();
+ if (LLVivoxVoiceClient::instanceExists())
+ {
+ LLWebRTCVoiceClient::getInstance()->terminate();
+ }
+ if (LLVivoxVoiceClient::instanceExists())
+ {
+ LLVivoxVoiceClient::getInstance()->terminate();
+ }
mSpatialVoiceModule = NULL;
m_servicePump = NULL;
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp
index eae71ca454..72a60c506b 100644
--- a/indra/newview/llvoicewebrtc.cpp
+++ b/indra/newview/llvoicewebrtc.cpp
@@ -82,9 +82,15 @@ const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc";
namespace {
- const F32 MAX_AUDIO_DIST = 50.0f;
- const F32 VOLUME_SCALE_WEBRTC = 0.01f;
- const F32 LEVEL_SCALE_WEBRTC = 0.008f;
+ const F32 MAX_AUDIO_DIST = 50.0f;
+ const F32 VOLUME_SCALE_WEBRTC = 0.01f;
+ const F32 TUNING_LEVEL_SCALE = 0.01f;
+ const F32 TUNING_LEVEL_START_POINT = 0.8f;
+ const F32 LEVEL_SCALE = 0.005f;
+ const F32 LEVEL_START_POINT = 0.18f;
+ const uint32_t SET_HIDDEN_RESTORE_DELAY_MS = 200; // 200 ms to unmute again after hiding during teleport
+ const uint32_t MUTE_FADE_DELAY_MS = 500; // 20ms fade followed by 480ms silence gets rid of the click just after unmuting.
+ // This is because the buffers and processing is cleared by the silence.
const F32 SPEAKING_AUDIO_LEVEL = 0.30;
@@ -201,7 +207,6 @@ bool LLWebRTCVoiceClient::sShuttingDown = false;
LLWebRTCVoiceClient::LLWebRTCVoiceClient() :
mHidden(false),
- mTuningMode(false),
mTuningMicGain(0.0),
mTuningSpeakerVolume(50), // Set to 50 so the user can hear themselves when he sets his mic volume
mDevicesListUpdated(false),
@@ -268,6 +273,11 @@ void LLWebRTCVoiceClient::cleanupSingleton()
void LLWebRTCVoiceClient::init(LLPumpIO* pump)
{
// constructor will set up LLVoiceClient::getInstance()
+ initWebRTC();
+}
+
+void LLWebRTCVoiceClient::initWebRTC()
+{
llwebrtc::init(this);
mWebRTCDeviceInterface = llwebrtc::getDeviceInterface();
@@ -283,8 +293,11 @@ void LLWebRTCVoiceClient::terminate()
return;
}
+ LL_INFOS("Voice") << "Terminating WebRTC" << LL_ENDL;
+
mVoiceEnabled = false;
llwebrtc::terminate();
+ mWebRTCDeviceInterface = nullptr;
sShuttingDown = true;
}
@@ -348,25 +361,45 @@ void LLWebRTCVoiceClient::updateSettings()
static LLCachedControl<std::string> sOutputDevice(gSavedSettings, "VoiceOutputAudioDevice");
setRenderDevice(sOutputDevice);
- LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice()) << LL_ENDL;
+ LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice())
+ << LL_ENDL;
static LLCachedControl<F32> sMicLevel(gSavedSettings, "AudioLevelMic");
setMicGain(sMicLevel);
llwebrtc::LLWebRTCDeviceInterface::AudioConfig config;
+ bool audioConfigChanged = false;
+
static LLCachedControl<bool> sEchoCancellation(gSavedSettings, "VoiceEchoCancellation", true);
- config.mEchoCancellation = sEchoCancellation;
+ if (sEchoCancellation != config.mEchoCancellation)
+ {
+ config.mEchoCancellation = sEchoCancellation;
+ audioConfigChanged = true;
+ }
static LLCachedControl<bool> sAGC(gSavedSettings, "VoiceAutomaticGainControl", true);
- config.mAGC = sAGC;
+ if (sAGC != config.mAGC)
+ {
+ config.mAGC = sAGC;
+ audioConfigChanged = true;
+ }
- static LLCachedControl<U32> sNoiseSuppressionLevel(gSavedSettings,
+ static LLCachedControl<U32> sNoiseSuppressionLevel(
+ gSavedSettings,
"VoiceNoiseSuppressionLevel",
llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel::NOISE_SUPPRESSION_LEVEL_VERY_HIGH);
- config.mNoiseSuppressionLevel = (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel)(U32)sNoiseSuppressionLevel;
-
- mWebRTCDeviceInterface->setAudioConfig(config);
+ auto noiseSuppressionLevel =
+ (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel)(U32)sNoiseSuppressionLevel;
+ if (noiseSuppressionLevel != config.mNoiseSuppressionLevel)
+ {
+ config.mNoiseSuppressionLevel = noiseSuppressionLevel;
+ audioConfigChanged = true;
+ }
+ if (audioConfigChanged)
+ {
+ mWebRTCDeviceInterface->setAudioConfig(config);
+ }
}
}
@@ -664,7 +697,10 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getCaptureDevices()
void LLWebRTCVoiceClient::setCaptureDevice(const std::string& name)
{
- mWebRTCDeviceInterface->setCaptureDevice(name);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setCaptureDevice(name);
+ }
}
void LLWebRTCVoiceClient::setDevicesListUpdated(bool state)
{
@@ -695,21 +731,38 @@ void LLWebRTCVoiceClient::OnDevicesChangedImpl(const llwebrtc::LLWebRTCVoiceDevi
std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
LL_DEBUGS("Voice") << "Setting devices to-input: '" << inputDevice << "' output: '" << outputDevice << "'" << LL_ENDL;
- clearRenderDevices();
- for (auto &device : render_devices)
+
+ // only set the render device if the device list has changed.
+ if (mRenderDevices.size() != render_devices.size() || !std::equal(mRenderDevices.begin(),
+ mRenderDevices.end(),
+ render_devices.begin(),
+ [](const LLVoiceDevice& a, const llwebrtc::LLWebRTCVoiceDevice& b) {
+ return a.display_name == b.mDisplayName && a.full_name == b.mID; }))
{
- addRenderDevice(LLVoiceDevice(device.mDisplayName, device.mID));
+ clearRenderDevices();
+ for (auto& device : render_devices)
+ {
+ addRenderDevice(LLVoiceDevice(device.mDisplayName, device.mID));
+ }
+ setRenderDevice(outputDevice);
}
- setRenderDevice(outputDevice);
- clearCaptureDevices();
- for (auto &device : capture_devices)
+ // only set the capture device if the device list has changed.
+ if (mCaptureDevices.size() != capture_devices.size() ||!std::equal(mCaptureDevices.begin(),
+ mCaptureDevices.end(),
+ capture_devices.begin(),
+ [](const LLVoiceDevice& a, const llwebrtc::LLWebRTCVoiceDevice& b)
+ { return a.display_name == b.mDisplayName && a.full_name == b.mID; }))
{
- LL_DEBUGS("Voice") << "Checking capture device:'" << device.mID << "'" << LL_ENDL;
+ clearCaptureDevices();
+ for (auto& device : capture_devices)
+ {
+ LL_DEBUGS("Voice") << "Checking capture device:'" << device.mID << "'" << LL_ENDL;
- addCaptureDevice(LLVoiceDevice(device.mDisplayName, device.mID));
+ addCaptureDevice(LLVoiceDevice(device.mDisplayName, device.mID));
+ }
+ setCaptureDevice(inputDevice);
}
- setCaptureDevice(inputDevice);
setDevicesListUpdated(true);
}
@@ -734,7 +787,10 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getRenderDevices()
void LLWebRTCVoiceClient::setRenderDevice(const std::string& name)
{
- mWebRTCDeviceInterface->setRenderDevice(name);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setRenderDevice(name);
+ }
}
void LLWebRTCVoiceClient::tuningStart()
@@ -762,7 +818,14 @@ bool LLWebRTCVoiceClient::inTuningMode()
void LLWebRTCVoiceClient::tuningSetMicVolume(float volume)
{
- mTuningMicGain = volume;
+ if (volume != mTuningMicGain)
+ {
+ mTuningMicGain = volume;
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setTuningMicGain(volume);
+ }
+ }
}
void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
@@ -774,21 +837,10 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)
}
}
-float LLWebRTCVoiceClient::getAudioLevel()
-{
- if (mIsInTuningMode)
- {
- return (1.0f - mWebRTCDeviceInterface->getTuningAudioLevel() * LEVEL_SCALE_WEBRTC) * mTuningMicGain / 2.1f;
- }
- else
- {
- return (1.0f - mWebRTCDeviceInterface->getPeerConnectionAudioLevel() * LEVEL_SCALE_WEBRTC) * mMicGain / 2.1f;
- }
-}
-
float LLWebRTCVoiceClient::tuningGetEnergy(void)
{
- return getAudioLevel();
+ float rms = mWebRTCDeviceInterface->getTuningAudioLevel();
+ return TUNING_LEVEL_START_POINT - TUNING_LEVEL_SCALE * rms;
}
bool LLWebRTCVoiceClient::deviceSettingsAvailable()
@@ -824,6 +876,11 @@ void LLWebRTCVoiceClient::setHidden(bool hidden)
if (inSpatialChannel())
{
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMute(mHidden || mMuteMic,
+ mHidden ? 0 : SET_HIDDEN_RESTORE_DELAY_MS); // delay 200ms so as to not pile up mutes/unmutes.
+ }
if (mHidden)
{
// get out of the channel entirely
@@ -990,7 +1047,6 @@ void LLWebRTCVoiceClient::updatePosition(void)
{
if (participant->mRegion != region->getRegionID()) {
participant->mRegion = region->getRegionID();
- setMuteMic(mMuteMic);
}
}
}
@@ -1115,13 +1171,14 @@ void LLWebRTCVoiceClient::sendPositionUpdate(bool force)
// Update our own volume on our participant, so it'll show up
// in the UI. This is done on all sessions, so switching
// sessions retains consistent volume levels.
-void LLWebRTCVoiceClient::updateOwnVolume() {
- F32 audio_level = 0.0;
- if (!mMuteMic && !mTuningMode)
+void LLWebRTCVoiceClient::updateOwnVolume()
+{
+ F32 audio_level = 0.0f;
+ if (!mMuteMic)
{
- audio_level = getAudioLevel();
+ float rms = mWebRTCDeviceInterface->getPeerConnectionAudioLevel();
+ audio_level = LEVEL_START_POINT - LEVEL_SCALE * rms;
}
-
sessionState::for_each(boost::bind(predUpdateOwnVolume, _1, audio_level));
}
@@ -1518,6 +1575,17 @@ void LLWebRTCVoiceClient::setMuteMic(bool muted)
}
mMuteMic = muted;
+
+ if (mIsInTuningMode)
+ {
+ return;
+ }
+
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMute(muted, muted ? MUTE_FADE_DELAY_MS : 0); // delay for 40ms on mute to allow buffers to empty
+ }
+
// when you're hidden, your mic is always muted.
if (!mHidden)
{
@@ -1556,7 +1624,10 @@ void LLWebRTCVoiceClient::setMicGain(F32 gain)
if (gain != mMicGain)
{
mMicGain = gain;
- mWebRTCDeviceInterface->setPeerConnectionGain(gain);
+ if (mWebRTCDeviceInterface)
+ {
+ mWebRTCDeviceInterface->setMicGain(gain);
+ }
}
}
@@ -1740,6 +1811,15 @@ void LLWebRTCVoiceClient::onChangeDetailed(const LLMute& mute)
}
}
+void LLWebRTCVoiceClient::userAuthorized(const std::string& user_id, const LLUUID& agentID)
+{
+ if (sShuttingDown)
+ {
+ sShuttingDown = false; // was terminated, restart
+ initWebRTC();
+ }
+}
+
void LLWebRTCVoiceClient::predSetUserMute(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const LLUUID &id, bool mute)
{
session->setUserMute(id, mute);
@@ -2308,7 +2388,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
return;
}
- bool iceCompleted = false;
LLSD body;
if (!connection->mIceCandidates.empty() || connection->mIceCompleted)
{
@@ -2347,7 +2426,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
LLSD body_candidate;
body_candidate["completed"] = true;
body["candidate"] = body_candidate;
- iceCompleted = connection->mIceCompleted;
connection->mIceCompleted = false;
}
@@ -2902,9 +2980,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
}
// else was already posted by llwebrtc::terminate().
break;
+ }
+
case VOICE_STATE_WAIT_FOR_CLOSE:
break;
+
case VOICE_STATE_CLOSED:
+ {
if (!mShutDown)
{
mVoiceConnectionState = VOICE_STATE_START_SESSION;
@@ -2980,7 +3062,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
return;
}
boost::json::object voice_data = voice_data_parsed.as_object();
- bool new_participant = false;
boost::json::object mute;
boost::json::object user_gain;
for (auto &participant_elem : voice_data)
@@ -3033,7 +3114,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
}
}
- new_participant |= joined;
if (!participant && joined && (primary || !isSpatial()))
{
participant = LLWebRTCVoiceClient::getInstance()->addParticipantByID(mChannelID, agent_id, mRegionID);
diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h
index 71347f206a..2ce575852a 100644
--- a/indra/newview/llvoicewebrtc.h
+++ b/indra/newview/llvoicewebrtc.h
@@ -204,7 +204,7 @@ public:
//@}
// authorize the user
- void userAuthorized(const std::string &user_id, const LLUUID &agentID) override {};
+ void userAuthorized(const std::string &user_id, const LLUUID &agentID) override;
void OnConnectionEstablished(const std::string& channelID, const LLUUID& regionID);
@@ -443,10 +443,8 @@ public:
boost::signals2::connection mAvatarNameCacheConnection;
private:
-
- // helper function to retrieve the audio level
- // Used in multiple places.
- float getAudioLevel();
+ // init or restart the WebRTC device interface.
+ void initWebRTC();
// Coroutine support methods
//---
@@ -458,7 +456,6 @@ private:
LL::WorkQueue::weak_t mMainQueue;
- bool mTuningMode;
F32 mTuningMicGain;
int mTuningSpeakerVolume;
bool mDevicesListUpdated; // set to true when the device list has been updated
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 5fb22184c3..cc593fe7b4 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -994,8 +994,11 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
LLUUID linked_id = item->getLinkedUUID();
LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id);
- can_favorite |= !linked_item->getIsFavorite();
- can_unfavorite |= linked_item->getIsFavorite();
+ if (linked_item)
+ {
+ can_favorite |= !linked_item->getIsFavorite();
+ can_unfavorite |= linked_item->getIsFavorite();
+ }
if (is_worn)
{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 493fcd5d45..856dee3dd4 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -346,7 +346,7 @@ void validate_framebuffer_object();
bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)
{
U32 orm = GL_RGBA;
- U32 norm = GL_RGBA16F;
+ U32 norm = GL_RGBA16;
U32 emissive = GL_RGB16F;
static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false);
@@ -426,6 +426,8 @@ void LLPipeline::init()
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
+ mReflectionMapManager.refreshSettings();
+
mInitialized = true;
stop_glerror();
@@ -860,8 +862,8 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT->deferredScreen.shareDepthBuffer(mRT->screen);
- if (shadow_detail > 0 || ssao || RenderDepthOfField)
- { //only need mRT->deferredLight for shadows OR ssao OR dof
+ if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField)
+ { //only need mRT->deferredLight for hdr OR shadows OR ssao OR dof
if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false;
}
else
@@ -907,7 +909,8 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mSceneMap.release();
}
- mPostMap.allocate(resX, resY, screenFormat);
+ mPostPingMap.allocate(resX, resY, GL_RGBA);
+ mPostPongMap.allocate(resX, resY, GL_RGBA);
// The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes.
// Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask.
@@ -1179,7 +1182,8 @@ void LLPipeline::releaseGLBuffers()
mWaterExclusionMask.release();
- mPostMap.release();
+ mPostPingMap.release();
+ mPostPongMap.release();
mFXAAMap.release();
@@ -1453,9 +1457,12 @@ void LLPipeline::createLUTBuffers()
U32 pix_format = GL_R16F;
#if LL_DARWIN
- // Need to work around limited precision with 10.6.8 and older drivers
- //
- pix_format = GL_R32F;
+ if(!gGLManager.mIsApple)
+ {
+ // Need to work around limited precision with 10.6.8 and older drivers
+ //
+ pix_format = GL_R32F;
+ }
#endif
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
@@ -7193,13 +7200,13 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
extern LLPointer<LLImageGL> gEXRImage;
-void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
+void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct)
{
+ LL_PROFILE_GPU_ZONE("tonemap");
+
dst->bindTarget();
// gamma correct lighting
{
- LL_PROFILE_GPU_ZONE("tonemap");
-
static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7211,17 +7218,33 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
bool no_post = gSnapshotNoPost || psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f || (buildNoPost && gFloaterTools && gFloaterTools->isAvailable());
- LLGLSLShader& shader = no_post ? gNoPostTonemapProgram : gDeferredPostTonemapProgram;
+ LLGLSLShader* shader = nullptr;
+ if(gamma_correct)
+ {
+ bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f;
+ if(legacy_gamma)
+ {
+ shader = no_post ? &gNoPostTonemapLegacyGammaCorrectProgram : &gDeferredPostTonemapLegacyGammaCorrectProgram;
+ }
+ else
+ {
+ shader = no_post ? &gNoPostTonemapGammaCorrectProgram : &gDeferredPostTonemapGammaCorrectProgram;
+ }
+ }
+ else
+ {
+ shader = no_post ? &gNoPostTonemapProgram : &gDeferredPostTonemapProgram;
+ }
- shader.bind();
+ shader->bind();
S32 channel = 0;
- shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
+ shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
- shader.bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap);
+ shader->bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap);
- shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
+ shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
static LLCachedControl<F32> exposure(gSavedSettings, "RenderExposure", 1.f);
@@ -7231,28 +7254,28 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
static LLStaticHashedString tonemap_mix("tonemap_mix");
static LLStaticHashedString tonemap_type("tonemap_type");
- shader.uniform1f(s_exposure, e);
+ shader->uniform1f(s_exposure, e);
static LLCachedControl<U32> tonemap_type_setting(gSavedSettings, "RenderTonemapType", 0U);
- shader.uniform1i(tonemap_type, tonemap_type_setting);
- shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
+ shader->uniform1i(tonemap_type, tonemap_type_setting);
+ shader->uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
mScreenTriangleVB->setBuffer();
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
gGL.getTexUnit(channel)->unbind(src->getUsage());
- shader.unbind();
+ shader->unbind();
}
dst->flush();
}
void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("gamma correct");
+
dst->bindTarget();
// gamma correct lighting
{
- LL_PROFILE_GPU_ZONE("gamma correct");
-
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);
@@ -7303,9 +7326,9 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*
void LLPipeline::generateGlow(LLRenderTarget* src)
{
+ LL_PROFILE_GPU_ZONE("glow generate");
if (sRenderGlow)
{
- LL_PROFILE_GPU_ZONE("glow");
mGlow[2].bindTarget();
mGlow[2].clear();
@@ -7414,13 +7437,22 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
{
static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
- if (cas_sharpness == 0.0f || !gCASProgram.isComplete())
+ LL_PROFILE_GPU_ZONE("cas");
+ if (cas_sharpness == 0.0f || !gCASProgram.isComplete() || !gCASLegacyGammaProgram.isComplete())
{
gPipeline.copyRenderTarget(src, dst);
return;
}
LLGLSLShader* sharpen_shader = &gCASProgram;
+ static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false);
+
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+ bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f;
+ if(legacy_gamma)
+ {
+ sharpen_shader = &gCASLegacyGammaProgram;
+ }
// Bind setup:
dst->bindTarget();
@@ -7458,6 +7490,7 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("FXAA");
{
llassert(!gCubeSnapshot);
bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
@@ -7549,7 +7582,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
// Present everything.
if (multisample)
{
- LL_PROFILE_GPU_ZONE("aa");
+ LL_PROFILE_GPU_ZONE("SMAA Edge");
static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
@@ -7580,14 +7613,14 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
{
if (!use_sample)
{
- src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
- gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
}
else
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);
- gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
+ gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
//if (use_stencil)
@@ -7661,13 +7694,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("SMAA");
llassert(!gCubeSnapshot);
bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
// Present everything.
if (multisample)
{
- LL_PROFILE_GPU_ZONE("aa");
static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
@@ -7745,8 +7778,9 @@ void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)
void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
{
- // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer.
+ LL_PROFILE_GPU_ZONE("glow combine");
+ // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer.
dst->bindTarget();
{
@@ -7765,6 +7799,7 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{
+ LL_PROFILE_GPU_ZONE("dof");
{
bool dof_enabled =
(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
@@ -7775,7 +7810,6 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
if (dof_enabled)
{
- LL_PROFILE_GPU_ZONE("dof");
LLGLDisable blend(GL_BLEND);
// depth of field focal plane calculations
@@ -7980,7 +8014,6 @@ void LLPipeline::renderFinalize()
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr();
-
if (hdr)
{
copyScreenSpaceReflections(&mRT->screen, &mSceneMap);
@@ -7989,22 +8022,31 @@ void LLPipeline::renderFinalize()
generateExposure(&mLuminanceMap, &mExposureMap);
- tonemap(&mRT->screen, &mPostMap);
-
- applyCAS(&mPostMap, &mRT->screen);
- }
+ static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
+ bool apply_cas = cas_sharpness != 0.0f && gCASProgram.isComplete() && gCASLegacyGammaProgram.isComplete();
- generateSMAABuffers(&mRT->screen);
+ tonemap(&mRT->screen, apply_cas ? &mRT->deferredLight : &mPostPingMap, !apply_cas);
- gammaCorrect(&mRT->screen, &mPostMap);
+ if (apply_cas)
+ {
+ // Gamma Corrects
+ applyCAS(&mRT->deferredLight, &mPostPingMap);
+ }
+ }
+ else
+ {
+ gammaCorrect(&mRT->screen, &mPostPingMap);
+ }
LLVertexBuffer::unbind();
- applySMAA(&mPostMap, &mRT->screen);
+ generateGlow(&mPostPingMap);
- generateGlow(&mRT->screen);
+ LLRenderTarget* sourceBuffer = &mPostPingMap;
+ LLRenderTarget* targetBuffer = &mPostPongMap;
- combineGlow(&mRT->screen, &mPostMap);
+ combineGlow(sourceBuffer, targetBuffer);
+ std::swap(sourceBuffer, targetBuffer);
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -8012,13 +8054,24 @@ void LLPipeline::renderFinalize()
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- renderDoF(&mPostMap, &mRT->screen);
+ if((RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
+ RenderDepthOfField &&
+ !gCubeSnapshot)
+ {
+ renderDoF(sourceBuffer, targetBuffer);
+ std::swap(sourceBuffer, targetBuffer);
+ }
- LLRenderTarget* finalBuffer = &mRT->screen;
- if (RenderFSAAType == 1)
+ if (RenderFSAAType == 1)
+ {
+ applyFXAA(sourceBuffer, targetBuffer);
+ std::swap(sourceBuffer, targetBuffer);
+ }
+ else if (RenderFSAAType == 2)
{
- applyFXAA(&mRT->screen, &mPostMap);
- finalBuffer = &mPostMap;
+ generateSMAABuffers(sourceBuffer);
+ applySMAA(sourceBuffer, targetBuffer);
+ std::swap(sourceBuffer, targetBuffer);
}
if (RenderBufferVisualization > -1)
@@ -8029,16 +8082,16 @@ void LLPipeline::renderFinalize()
case 1:
case 2:
case 3:
- visualizeBuffers(&mRT->deferredScreen, finalBuffer, RenderBufferVisualization);
+ visualizeBuffers(&mRT->deferredScreen, sourceBuffer, RenderBufferVisualization);
break;
case 4:
- visualizeBuffers(&mLuminanceMap, finalBuffer, 0);
+ visualizeBuffers(&mLuminanceMap, sourceBuffer, 0);
break;
case 5:
{
if (RenderFSAAType > 0)
{
- visualizeBuffers(&mFXAAMap, finalBuffer, 0);
+ visualizeBuffers(&mFXAAMap, sourceBuffer, 0);
}
break;
}
@@ -8046,7 +8099,7 @@ void LLPipeline::renderFinalize()
{
if (RenderFSAAType == 2)
{
- visualizeBuffers(&mSMAABlendBuffer, finalBuffer, 0);
+ visualizeBuffers(&mSMAABlendBuffer, sourceBuffer, 0);
}
break;
}
@@ -8060,10 +8113,10 @@ void LLPipeline::renderFinalize()
gDeferredPostNoDoFNoiseProgram.bind(); // Add noise as part of final render to screen pass to avoid damaging other post effects
// Whatever is last in the above post processing chain should _always_ be rendered directly here. If not, expect problems.
- gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, finalBuffer);
+ gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, sourceBuffer);
gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
- gDeferredPostNoDoFNoiseProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)finalBuffer->getWidth(), (GLfloat)finalBuffer->getHeight());
+ gDeferredPostNoDoFNoiseProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)sourceBuffer->getWidth(), (GLfloat)sourceBuffer->getHeight());
{
LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 315e38ed8c..dff0af46e2 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -155,7 +155,7 @@ public:
void copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst);
void generateLuminance(LLRenderTarget* src, LLRenderTarget* dst);
void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);
- void tonemap(LLRenderTarget* src, LLRenderTarget* dst);
+ void tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct);
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
void generateGlow(LLRenderTarget* src);
void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
@@ -730,7 +730,8 @@ public:
LLRenderTarget mLastExposure;
// tonemapped and gamma corrected render ready for post
- LLRenderTarget mPostMap;
+ LLRenderTarget mPostPingMap;
+ LLRenderTarget mPostPongMap;
// FXAA helper target
LLRenderTarget mFXAAMap;
diff --git a/indra/newview/skins/default/xui/da/floater_search.xml b/indra/newview/skins/default/xui/da/floater_search.xml
deleted file mode 100644
index 80a30b1aa1..0000000000
--- a/indra/newview/skins/default/xui/da/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="FIND">
- <floater.string name="loading_text">
- Henter...
- </floater.string>
- <floater.string name="done_text">
- Færdig
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Gentag søgning med &quot;God level&quot;
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml
deleted file mode 100644
index bd39bf2bce..0000000000
--- a/indra/newview/skins/default/xui/de/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Wird geladen...
- </floater.string>
- <floater.string name="done_text">
- Fertig
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml
new file mode 100644
index 0000000000..99fb3a1ad8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ legacy_header_height="18"
+ can_minimize="true"
+ can_close="true"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="500"
+ min_width="600"
+ name="Marketplace"
+ save_rect="true"
+ single_instance="true"
+ save_visibility="true"
+ title="MARKETPLACE"
+ tab_stop="true"
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ animate="false"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|left"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="2"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ auto_resize="true"
+ width="585">
+ <web_browser
+ bottom="-2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="marketplace_contents"
+ top="0"/>
+ </layout_panel>
+ <layout_panel name="status_bar"
+ height="23"
+ auto_resize="false">
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="3"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index fc1e32915a..43c4aa1b9d 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -1,18 +1,202 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- positioning="cascading"
legacy_header_height="18"
+ can_minimize="true"
+ can_close="true"
can_resize="true"
height="775"
layout="topleft"
- min_height="400"
- min_width="500"
- name="floater_search"
- help_topic="floater_search"
+ min_height="500"
+ min_width="600"
+ name="Search"
save_rect="true"
+ single_instance="true"
save_visibility="true"
- title=""
- initial_mime_type="text/html"
- width="780"
+ title="SEARCH"
tab_stop="true"
- filename="floater_web_content.xml"/>
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ animate="false"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|left"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="2"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ auto_resize="true"
+ width="585">
+ <web_browser
+ bottom="-2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ trusted_content="true"
+ name="search_contents"
+ top="0"/>
+ </layout_panel>
+ <layout_panel name="status_bar"
+ height="23"
+ auto_resize="false">
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="3"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
index a93be6a18d..c40ae3ea06 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
@@ -66,6 +66,7 @@
visible="false"
name="comment_text"
follows="left|top"
+ max_length="1024"
width="240"
top_delta="20"
word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
index 2e1dfa00c7..53796f0959 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -178,7 +178,7 @@
width="22">
<button.commit_callback
function="WebContent.TestURL"
- parameter="https://sl-viewer-media-system.s3.amazonaws.com/index.html"/>
+ parameter="https://sl-viewer-media-system.s3.amazonaws.com/bookmarks/index.html"/>
</button>
</layout_panel>
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
index d8090070bd..3cfe2e0e6f 100644
--- a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
@@ -687,51 +687,6 @@
parameter="remove_from_favorites" />
</menu_item_call>
<menu
- label="Use as default for"
- layout="topleft"
- name="upload_def">
- <menu_item_call
- label="Image uploads"
- layout="topleft"
- name="Image uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="texture" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Sound uploads"
- layout="topleft"
- name="Sound uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="sound" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Animation uploads"
- layout="topleft"
- name="Animation uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="animation" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
- label="Model uploads"
- layout="topleft"
- name="Model uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="model" />
- <menu_item_call.on_visible
- function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- </menu>
- <menu
label="Upload to folder"
layout="topleft"
name="upload_options">
@@ -812,54 +767,69 @@
label="Use as default for"
layout="topleft"
name="upload_def">
- <menu_item_call
+ <menu_item_check
label="Image uploads"
layout="topleft"
name="Image uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_texture" />
- <menu_item_call.on_visible
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_texture" />
+ </menu_item_check>
+ <menu_item_check
label="Sound uploads"
layout="topleft"
name="Sound uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_sound" />
- <menu_item_call.on_visible
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_sound" />
+ </menu_item_check>
+ <menu_item_check
label="Animation uploads"
layout="topleft"
name="Animation uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_animation" />
- <menu_item_call.on_visible
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_animation" />
+ </menu_item_check>
+ <menu_item_check
label="Model uploads"
layout="topleft"
name="Model uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_model" />
- <menu_item_call.on_visible
+ <on_visible
function="Inventory.CanSetUploadLocation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_model" />
+ </menu_item_check>
+ <menu_item_check
label="PBR material uploads"
layout="topleft"
name="PBR uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_pbr_material" />
- </menu_item_call>
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_pbr_material" />
+ </menu_item_check>
</menu>
<menu_item_separator
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index f998aefb29..8bbcefceac 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -1064,46 +1064,61 @@
label="Use as default for"
layout="topleft"
name="upload_def">
- <menu_item_call
+ <menu_item_check
label="Image uploads"
layout="topleft"
name="Image uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_texture" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_texture" />
+ </menu_item_check>
+ <menu_item_check
label="Sound uploads"
layout="topleft"
name="Sound uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_sound" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_sound" />
+ </menu_item_check>
+ <menu_item_check
label="Animation uploads"
layout="topleft"
name="Animation uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_animation" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_animation" />
+ </menu_item_check>
+ <menu_item_check
label="Model uploads"
layout="topleft"
name="Model uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_model" />
- </menu_item_call>
- <menu_item_call
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_model" />
+ </menu_item_check>
+ <menu_item_check
label="PBR material uploads"
layout="topleft"
name="PBR uploads">
- <menu_item_call.on_click
+ <on_click
function="Inventory.FileUploadLocation"
parameter="def_pbr_material" />
- </menu_item_call>
+ <on_check
+ function="Inventory.FileUploadLocation.Check"
+ parameter="def_pbr_material" />
+ </menu_item_check>
</menu>
<menu_item_separator
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
index f9864637a0..e687ae93e8 100644
--- a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
@@ -40,4 +40,12 @@
<menu_item_call.on_click
function="Open.WebInspector" />
</menu_item_call>
+ <menu_item_call
+ label="Show Source"
+ layout="topleft"
+ name="show_page_source"
+ visible="false">
+ <menu_item_call.on_click
+ function="Open.ShowSource" />
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml
index f3e520700b..d43ce26e56 100644
--- a/indra/newview/skins/default/xui/en/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml
@@ -41,6 +41,17 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Zoom in"
+ layout="topleft"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="ObjectIcon.Action"
+ parameter="obj_zoom_in" />
+ <menu_item_call.on_enable
+ function="ObjectIcon.Visible"
+ parameter="obj_zoom_in" />
+ </menu_item_call>
+ <menu_item_call
label="Show on Map"
layout="topleft"
name="show_on_map">
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index 1874c01f8d..fb6081e1fb 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -26,6 +26,13 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Zoom in"
+ layout="topleft"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="Url.ZoomInObject" />
+ </menu_item_call>
+ <menu_item_call
label="Show on Map"
layout="topleft"
name="show_on_map">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index b182a241d8..536008c85c 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2239,6 +2239,25 @@ Couldn&apos;t open uploaded sound file for reading:
<notification
icon="alertmodal.tga"
+ name="ModelUploaderMissingPhysicsApple"
+ type="alertmodal">
+Model upload is not yet available on Apple Silicon, but will be supported in an upcoming release.
+
+Workaround: Right-click the Second Life app in Finder, select
+"Get Info", then check "Open using Rosetta"
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ModelUploaderMissingPhysics"
+ type="alertmodal">
+Physics library is not present, some of the model uploader's functionality might not work or might not work correctly.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="SoundFileNotRIFF"
type="alertmodal">
File does not appear to be a RIFF WAVE file:
@@ -12147,6 +12166,17 @@ Cannot create large prims that intersect other residents. Please re-try when ot
<notification
icon="alertmodal.tga"
+ name="PreferenceQualityWithLowMemory"
+ type="alert">
+Your system has [TOTAL_MEM]MB of memory, which might not be enough to run viewer at higher settings and might result in issues.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Continue"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="DefaultObjectPermissions"
type="alert">
There was a problem saving the default object permissions: [REASON]. Please try setting the default permissions later.
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index c31e6c94ea..1be34550fa 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -177,6 +177,25 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
function="People.DelFriend" />
</dnd_button>
</panel>
+ <slider
+ control_name="NearMeRange"
+ decimal_digits="0"
+ increment="1"
+ follows="left|top"
+ left="5"
+ min_val="0"
+ max_val="4096"
+ label="Range:"
+ name="near_me_range"
+ tool_tip="Nearby people range"
+ width="230"/>
+ <text
+ type="string"
+ follows="left|top"
+ left_delta="225"
+ name="near_me_range_text2">
+ m
+ </text>
<layout_stack
clip="false"
follows="all"
@@ -216,7 +235,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
<avatar_list
allow_select="true"
follows="all"
- height="211"
+ height="197"
ignore_online_status="true"
layout="topleft"
left="3"
diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml
deleted file mode 100644
index e24d8064a1..0000000000
--- a/indra/newview/skins/default/xui/es/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Cargando...
- </floater.string>
- <floater.string name="done_text">
- Hecho
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Redo search to reflect current God level
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml
deleted file mode 100644
index 32800182ea..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Chargement...
- </floater.string>
- <floater.string name="done_text">
- Terminé
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Relancer la recherche pour refléter le niveau divin actuel
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml
deleted file mode 100644
index ac3dc17aa3..0000000000
--- a/indra/newview/skins/default/xui/it/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Caricamento in corso...
- </floater.string>
- <floater.string name="done_text">
- Fine
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml
deleted file mode 100644
index 531ac77f95..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- 読み込んでいます…。
- </floater.string>
- <floater.string name="done_text">
- 完了
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- 現在のゴッドレベルに反映させるため、検索をやり直してください。
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml
deleted file mode 100644
index 3509cb786d..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Carregando...
- </floater.string>
- <floater.string name="done_text">
- Pronto
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Buscar novamente com status God
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml
deleted file mode 100644
index 405a6598ac..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Загрузка...
- </floater.string>
- <floater.string name="done_text">
- Готово
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Повторить поиск, чтобы показать текущий уровень творца
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml
deleted file mode 100644
index 08c1e5162c..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- Yükleniyor...
- </floater.string>
- <floater.string name="done_text">
- Tamamlandı
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- Mevcut Yönetici seviyesini dikkate alarak aramayı yenile
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
deleted file mode 100644
index 3e85a529ae..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_search.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="">
- <floater.string name="loading_text">
- 載入中...
- </floater.string>
- <floater.string name="done_text">
- 完成
- </floater.string>
- <layout_stack name="stack1">
- <layout_panel name="browser_layout">
- <text name="refresh_search">
- 以目前具備的神階級再搜尋一次
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index e1e0441df0..e46073057e 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -63,7 +63,6 @@ class ViewerManifest(LLManifest):
def construct(self):
super(ViewerManifest, self).construct()
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
- self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
if self.is_packaging_viewer():
with self.prefix(src_dst="app_settings"):
@@ -275,13 +274,13 @@ class ViewerManifest(LLManifest):
# All lines up to and including the first blank line are the file header; skip them
lines.reverse() # so that pop will pull from first to last line
- while not re.match("\s*$", lines.pop()) :
+ while not re.match(r"\s*$", lines.pop()) :
pass # do nothing
# A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names
names = []
for line in lines :
- if re.match("\S", line) :
+ if re.match(r"\S", line) :
names.append(line.rstrip())
# It's not fair to always put the same people at the head of the list
random.shuffle(names)
@@ -625,12 +624,16 @@ class Windows_x86_64_Manifest(ViewerManifest):
with self.prefix(src=os.path.join(pkgdir, 'bin', config)):
self.path("chrome_elf.dll")
self.path("d3dcompiler_47.dll")
+ self.path("dxcompiler.dll")
+ self.path("dxil.dll")
self.path("libcef.dll")
self.path("libEGL.dll")
self.path("libGLESv2.dll")
- self.path("dullahan_host.exe")
- self.path("snapshot_blob.bin")
self.path("v8_context_snapshot.bin")
+ self.path("vk_swiftshader.dll")
+ self.path("vk_swiftshader_icd.json")
+ self.path("vulkan-1.dll")
+ self.path("dullahan_host.exe")
# MSVC DLLs needed for CEF and have to be in same directory as plugin
with self.prefix(src=os.path.join(self.args['build'], os.pardir,
@@ -862,14 +865,29 @@ class Darwin_x86_64_Manifest(ViewerManifest):
# CEF framework goes inside Contents/Frameworks.
# Remember where we parked this car.
- with self.prefix(src="", dst="Frameworks"):
- CEF_framework = "Chromium Embedded Framework.framework"
- self.path2basename(relpkgdir, CEF_framework)
- CEF_framework = self.dst_path_of(CEF_framework)
+ with self.prefix(src=relpkgdir, dst="Frameworks"):
+ self.path("libndofdev.dylib")
+
if self.args.get('bugsplat'):
self.path2basename(relpkgdir, "BugsplatMac.framework")
+ # OpenAL dylibs
+ if self.args['openal'] == 'ON':
+ for libfile in (
+ "libopenal.dylib",
+ "libalut.dylib",
+ ):
+ self.path(libfile)
+
+ # WebRTC libraries
+ with self.prefix(src=os.path.join(self.args['build'], os.pardir,
+ 'sharedlibs', self.args['buildtype'], 'Resources')):
+ for libfile in (
+ 'libllwebrtc.dylib',
+ ):
+ self.path(libfile)
+
with self.prefix(dst="MacOS"):
executable = self.dst_path_of(self.channel())
if self.args.get('bugsplat'):
@@ -929,16 +947,12 @@ class Darwin_x86_64_Manifest(ViewerManifest):
self.path("*.png")
self.path("*.gif")
- with self.prefix(src=relpkgdir, dst=""):
- self.path("libndofdev.dylib")
-
with self.prefix(src_dst="cursors_mac"):
self.path("*.tif")
self.path("licenses-mac.txt", dst="licenses.txt")
self.path("featuretable_mac.txt")
self.path("cube.dae")
- self.path("SecondLife.nib")
with self.prefix(src=pkgdir,dst=""):
self.path("ca-bundle.crt")
@@ -991,20 +1005,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):
print("Skipping %s" % dst)
return added
- # WebRTC libraries
- with self.prefix(src=os.path.join(self.args['build'], os.pardir,
- 'sharedlibs', self.args['buildtype'], 'Resources')):
- for libfile in (
- 'libllwebrtc.dylib',
- ):
- self.path(libfile)
-
- oldpath = os.path.join("@rpath", libfile)
- self.run_command(
- ['install_name_tool', '-change', oldpath,
- '@executable_path/../Resources/%s' % libfile,
- executable])
-
# dylibs is a list of all the .dylib files we expect to need
# in our bundled sub-apps. For each of these we'll create a
# symlink from sub-app/Contents/Resources to the real .dylib.
@@ -1029,20 +1029,6 @@ class Darwin_x86_64_Manifest(ViewerManifest):
):
self.path2basename(relpkgdir, libfile)
- # OpenAL dylibs
- if self.args['openal'] == 'ON':
- for libfile in (
- "libopenal.dylib",
- "libalut.dylib",
- ):
- dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
- oldpath = os.path.join("@rpath", libfile)
- self.run_command(
- ['install_name_tool', '-change', oldpath,
- '@executable_path/../Resources/%s' % libfile,
- executable])
-
# our apps
executable_path = {}
embedded_apps = [ (os.path.join("llplugin", "slplugin"), "SLPlugin.app") ]
@@ -1053,123 +1039,34 @@ class Darwin_x86_64_Manifest(ViewerManifest):
executable_path[app] = \
self.dst_path_of(os.path.join(app, "Contents", "MacOS"))
- # our apps dependencies on shared libs
- # for each app, for each dylib we collected in dylibs,
- # create a symlink to the real copy of the dylib.
- with self.prefix(dst=os.path.join(app, "Contents", "Resources")):
- for libfile in dylibs:
- self.relsymlinkf(os.path.join(libfile_parent, libfile))
-
# Dullahan helper apps go inside SLPlugin.app
with self.prefix(dst=os.path.join(
"SLPlugin.app", "Contents", "Frameworks")):
-
- frameworkname = 'Chromium Embedded Framework'
-
- # This code constructs a relative symlink from the
- # target framework folder back to the real CEF framework.
- # It needs to be relative so that the symlink still works when
- # (as is normal) the user moves the app bundle out of the DMG
- # and into the /Applications folder. Note we pass catch=False,
- # letting the uncaught exception terminate the process, since
- # without this symlink, Second Life web media can't possibly work.
-
- # It might seem simpler just to symlink Frameworks back to
- # the parent of Chromimum Embedded Framework.framework. But
- # that would create a symlink cycle, which breaks our
- # packaging step. So make a symlink from Chromium Embedded
- # Framework.framework to the directory of the same name, which
- # is NOT an ancestor of the symlink.
-
- # from SLPlugin.app/Contents/Frameworks/Chromium Embedded
- # Framework.framework back to
- # $viewer_app/Contents/Frameworks/Chromium Embedded Framework.framework
- SLPlugin_framework = self.relsymlinkf(CEF_framework, catch=False)
-
- # for all the multiple CEF/Dullahan (as of CEF 76) helper app bundles we need:
- for helper in (
- "DullahanHelper",
- "DullahanHelper (GPU)",
- "DullahanHelper (Renderer)",
- "DullahanHelper (Plugin)",
- ):
- # app is the directory name of the app bundle, with app/Contents/MacOS/helper as the executable
- app = helper + ".app"
-
- # copy DullahanHelper.app
- self.path2basename(relpkgdir, app)
-
- # and fix that up with a Frameworks/CEF symlink too
- with self.prefix(dst=os.path.join(
- app, 'Contents', 'Frameworks')):
- # from Dullahan Helper *.app/Contents/Frameworks/Chromium Embedded
- # Framework.framework back to
- # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
- # Since SLPlugin_framework is itself a
- # symlink, don't let relsymlinkf() resolve --
- # explicitly call relpath(symlink=True) and
- # create that symlink here.
- helper_framework = \
- self.symlinkf(self.relpath(SLPlugin_framework, symlink=True), catch=False)
-
- # change_command includes install_name_tool, the
- # -change subcommand and the old framework rpath
- # stamped into the executable. To use it with
- # run_command(), we must still append the new
- # framework path and the pathname of the
- # executable to change.
- change_command = [
- 'install_name_tool', '-change',
- '@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework']
-
- with self.prefix(dst=os.path.join(
- app, 'Contents', 'MacOS')):
- # Now self.get_dst_prefix() is, at runtime,
- # @executable_path. Locate the helper app
- # framework (which is a symlink) from here.
- newpath = os.path.join(
- '@executable_path',
- self.relpath(helper_framework, symlink=True),
- frameworkname)
- # and restamp the Dullahan Helper executable itself
- self.run_command(
- change_command +
- [newpath, self.dst_path_of(helper)])
-
- # SLPlugin plugins
- with self.prefix(dst="llplugin"):
- dylibexecutable = 'media_plugin_cef.dylib'
+ # copy CEF plugin
self.path2basename("../media_plugins/cef/" + self.args['configuration'],
- dylibexecutable)
-
- # 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"):
+ "media_plugin_cef.dylib")
+
+ # copy LibVLC plugin
+ self.path2basename("../media_plugins/libvlc/" + self.args['configuration'],
+ "media_plugin_libvlc.dylib")
+
+ # CEF framework and vlc libraries goes inside Contents/Frameworks.
+ with self.prefix(src=os.path.join(pkgdir, 'lib', 'release')):
+ self.path("Chromium Embedded Framework.framework")
+ self.path("DullahanHelper.app")
+ self.path("DullahanHelper (Alerts).app")
+ self.path("DullahanHelper (GPU).app")
+ self.path("DullahanHelper (Renderer).app")
+ self.path("DullahanHelper (Plugin).app")
+
+ # Copy libvlc
self.path( "libvlc*.dylib*" )
# copy LibVLC plugins folder
- with self.prefix(src='plugins', dst=""):
+ with self.prefix(src='plugins', dst="plugins"):
self.path( "*.dylib" )
self.path( "plugins.dat" )
+
def package_finish(self):
imagename = self.installer_base_name()
self.set_github_output('imagename', imagename)